2010-03-26 2 views
0

Я пытаюсь объявить частную структуру данных, такую ​​как Вектор в моем заголовочном файле C++, который я хочу в конечном итоге использовать в реализации метода моего .cpp.Объявление структур данных STL, таких как Вектор в .h

Примером может быть мой заголовок "SomeClass.h", где у меня есть:

class SomeClass 
{ 
    private: 
    Vector<T> myVector; 
    public: 
    void AddTtoMyVector(T add); 
} 

И в моем .cpp, который "SomeClass.cpp", у меня есть следующие:

#include "SomeClass.h" 

SomeClass::AddTtoMyVector(T add) 
{ 
    myVector.Push_back(add); 
} 

Будет ли синтаксис работать здесь? Или существует другой способ объявления и заполнения таких структур?

+0

Вы имеете в виду общий тип 'T' (например, шаблоны) или *" для определенного типа 'T'' *? –

+0

Вы имеете в виду std :: vector. Если нет - что такое Вектор – pm100

+1

Да. Это std :: vector, а T - некоторый конкретный тип, примером может быть структура или int или какой-либо другой тип данных. –

ответ

2

Не забудьте указать, что вы используете вектор STL, используя либо

std::vector<T> myVector; 

или

using std::vector; 

Кроме того, если T это общий тип, вы хотите, чтобы весь класс шаблонный :

#include <vector> 

using std::vector; 

template< typename T > 
class SomeClass 
{ 
    private: 
    vector<T> myVector; 
    public: 
    void AddTtoMyVector(T add) {myVector.push_back(add);} 
} 
+0

Спасибо Артем. Так что, говоря о чистоте незнания C++, возможно ли, чтобы объявления были в .h и реализации, которые должны быть в .cpp? Я рисую параллель с C#, где у нас есть сигнатуры функций в интерфейсе и декларации в классе, реализующем интерфейс. –

+0

Да, реализация может быть перенесена в файл .cpp так же, как вы писали в своем исходном сообщении (хотя распространенная практика заключается в том, чтобы сохранить однострочные в файле .h, компиляторы часто встраивают такую ​​функцию). –

+0

Да, это типичный способ делать вещи. Бывают ситуации, когда реализация должна быть в заголовке [в частности, в коде шаблона и встроенных функциях], но в целом это неверно. –

1

Следуя за ответом Артема, следует упомянуть, что хотя стандартная практика для обычных классов C++ заключается в размещении объявлений в файле .h и реализаций в соответствующем файле .cpp, это обычно относится только к классам без шаблона. Если вы пишете класс шаблона, вся реализация обычно помещается в тот же файл .h, который определяет интерфейс шаблона. Для этого есть несколько причин, и если вы планируете разрабатывать шаблон, я бы предложил изучить этот вопрос немного дальше. Скорее всего, это сэкономит вам время.

+0

Спасибо Ракис. Можете ли вы указать на некоторые причины, по которым реализации класса Template находятся в том же файле, что и .h? Класс шаблона может быть классом со средней и высокой степенью сложности и из моего опыта работы с другими объектно-ориентированными языками, такими как C#, смешивание определение с реализацией не является такой хорошей идеей в большинстве случаев. –

+0

Шаблоны таковы: шаблоны. Компилятор создает совершенно новый код по запросу на основе этого шаблона. Но для этого ему нужен доступ ко всему коду для шаблона, а не только к именам функций. Вы все же можете разделить реализацию, часто с помощью #include «blah.cpp» в нижней части «blah.h». –

+0

Книга C++ на Stroustroup (чрезвычайно рекомендуемое чтение) охватывает основные проблемы. Я уверен, что поиск в Интернете также станет хорошим источником информации. По сути, это скорее практическая проблема возможностей компилятора и организации проекта, чем проблема разработки программного обеспечения. Существует ряд подходов, таких как предложенный Деннисом, но в конечном итоге это вопрос стиля, когда учитываются возможности компилятора. – Rakis

Смежные вопросы