2013-03-31 2 views
1

Я пытаюсь инициализировать свой MedList, но он не работает. Вот что я говорю: repository.hИнициализировать список динамических векторов

#include "../domain/farmacy.h" 
#include "../utils/DynamicVector.h" 
class Repository{ 

private: 
    DynamicVector<Medicine>* MedList; //I made it pointer so it can be dynamic 

public: 
Repository(); //constructor 

repository.cpp

#include "../domain/farmacy.h" 
#include "repository.h" 
#include "../utils/DynamicVector.h" 
#include <stdlib.h> 

Repository::Repository(){ 
    this->MedList=new DynamicVector<Medicine>::DynamicVector(); //error 
} 

DynamicVector.h

template <typename Element> //this is the Dynamic Vector constructor 
DynamicVector<Element>::DynamicVector() 
{ 
    this->cap=10; 
    this->len=0; 
    this->elems=new Element[this->cap]; 
} 

ошибка выше:

Multiple markers at this line 
    - no match for 'operator=' in '((Repository*)this)->Repository::MedList = (int*)operator 
    new(4u)' 
    - expected type-specifier 
    - candidate is: 
    - expected ';' 

это класс медицина

class Medicine{ 

private: 
    int ID; 
    std::string nume; 
    double concentratie; 
    int cantitate; 

Динамический класс Vector:

template <typename Element> 
class DynamicVector{ 

private: 
    Element* elems; 
    int cap; 
    int len; 
    void resize(); 
    void CopyToThis(const DynamicVector& v); 

public: 
    DynamicVector(); //constructor implicit 
    DynamicVector(const DynamicVector&); //constructor de copiere 
    DynamicVector& operator=(const DynamicVector&); 
    ~DynamicVector(); 
    void addElement(Element elem); 
    Element delElementAtPosition(int pos); 
    Element getElementAtPosition(int pos); 
    int getLen(); 

}; 

Что я делаю неправильно? Я пробовал много вариантов, но ничего не работает. Не могли бы вы помочь мне?

+0

Вы можете оставить класс dynamicVector? – 2013-03-31 12:37:30

+0

@stardust_ Я обновил код –

+0

Да, у вас нет конструктора delared. См. Мой ответ. – 2013-03-31 12:52:04

ответ

0

Конструктор должен быть:

Repository::Repository(){ 
    this->MedList=new DynamicVector<Medicine>; 
} 

DynamicVector() вызывает конструктор DynamicVector.

DynamicVector :: DynamicVector() является указателем на адрес функции конструктора

+0

он тоже не работает. Благодаря! Это ошибка: Несколько маркеров в этой строке \t - кандидат: \t - нет соответствия для 'operator =' in '((Репозиторий *) this) -> Репозиторий :: MedList = (оператор new (12u), (, \t ((DynamicVector *) ))) ' –

+0

... отредактировал ... это работает? Я удалил скобку – maditya

+0

Нет, ошибка: неопределенная ссылка на 'DynamicVector :: DynamicVector() ' –

1

Я думаю, что вы путаете C++ синтаксиса для создания объекта с каким-либо другим языком, например, Java или C#.

В C++ конструктор называется просто объявить переменную:

DynamicVector<Element> medList; // Calls DynamicVector<Element>::DynamicVector() 

new оператор в C#, чтобы динамически выделять место для переменной и возвращает указатель на выделенное пространство. Для того, чтобы использовать его здесь, вы должны объявить Repository :: MedList как тип указателя, и инициализировать его следующим образом:

DynamicVector<Medicine>* MedList; // in repository.h 

this->MedList = new DynamicVector<Medicine>(); // in repository.cpp 

Однако, как Энди Проул отметил, что это гораздо лучше просто позволить компилятору сделайте управление памятью для себя. Чтобы сделать это, вы должны полностью удалить ошибочную строку в repository.cpp. Зачем? Ну, когда репозиторий построен, компилятор также пытается построить все объекты-члены, используя их конструкторы по умолчанию. Это именно то, что вы хотите, поэтому нет причин пытаться изменить поведение компилятора.

+0

Дух этого ответа правильно, но OP _has_ объявил элемент 'medList' как указатель. Это было _probably_ ненужным, но зависит от реализации 'DynamicVector'. – Chad

+0

DynamicVector * MedList; // in repository.h это-> MedList = новый DynamicVector (); // в файле repository.cpp он не работает. Ошибка: неопределенная ссылка на 'DynamicVector :: DynamicVector() ' –

+0

У вас есть другие проблемы, не показанные приведенными примерами кода (например, отсутствующие директивы include). Можете ли вы обновить свой вопрос с помощью своего фактического кода? – Chad

0

Скорее всего, ваша версия на C++ не допускает пустых() для конструкторов.

this->MedList=new DynamicVector<Medicine>::DynamicVector(); //error 

должен быть

this->MedList=new DynamicVector<Medicine>::DynamicVector; 

или (Обычный способ написания его)

this->MedList=new DynamicVector<Medicine>; 

Смотрите здесь для получения дополнительной информации.

EDIT. Убедитесь, что вы объявили конструктор dynamicVector в классе.


Default constructor with empty brackets

Do the parentheses after the type name make a difference with new?

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