2015-06-21 2 views
0

Мне нужно создать небольшой проект gui с использованием форм Visual Studio 2012, основная проблема: Я не могу создать массив объектов для своей жизни, даже не реализуются проекты сокурсников.C++/cli windows forms in vs2012, массив объектов невозможен

array<className^>^ arrayName = gcnew array<className^>(100); 

Или в моем случае:

array<kind^> ^testArray = gcnew array<kind^>(100); 

должны работать. Должен. Ошибка несколько напоминает

Error: data member initializer is not allowed

Он работает для других, но как-то не для меня в vs2012, несмотря на то, что это точно так же. Не понимаю, чего мне не хватает.

Быстрый и грязный пример classes.h я создал, чтобы проверить материал:

ref class memberino { 
private: 
    String^ memVar; 
public: 
    memberino(){}; 
    memberino(String^ memVar_); 
    String^ getMemVar() { return memVar; } 
    void setMemVar(String^ memVar_) { this->memVar = memVar_; } 
}; 

ref class baseClass abstract { 
private: 
    String^ baseVar; 
    memberino M; 
public: 
    baseClass(){}; 
    baseClass(String^ baseVar_, String^ memVar_); 
    virtual String^ getMemVar() { return M.getMemVar(); } 
    virtual String^ getBaseVar() { return baseVar; } 
    virtual void setBaseVar(String^ baseVar_) { this->baseVar = baseVar_; } 
    virtual String^ getChildVar() = 0; 
}; 

ref class kind: public baseClass { 
private: 
    String^ childVar; 
public: 
    kind(){}; 
    kind(String^ baseVar_, String^ memVar_, String^ childVar_); 
    virtual String^ getChildVar() override { return childVar; } 
    virtual void setChildVar(String^ childVar_) { this->childVar = childVar_; } 
}; 

И в classes.cpp:

memberino::memberino(String^ memVar_){ 
    this->setMemVar(memVar_); 
} 
baseClass::baseClass(String^ baseVar_, String^ memVar_):M(memVar_){ 
    this->setBaseVar(baseVar_); 
} 
kind::kind(String^ baseVar_, String^ memVar_, String^ childVar_): 
baseClass(baseVar_, memVar_){ 
    this->setChildVar(childVar_); 
} 

В MyForm.h я просто пытаюсь создать массив, подобный:

array<kind^> ^testArray = gcnew array<kind^>(100); 

Прежде чем пытаться запустить его, он подчеркивает красную ошибку, упомянутую выше. Компиляция это дает следующий результат:

warning C4677: "testArray": The signature of the non-private member includes the private assemblytype "kind".

error C3845: "pr5temp::MyForm::testArray": Only static data members can be initialized in a reference class or value type

не 100%, как это перевод с немецкого на английский, но в случае, если это помогает:

warning C4677: "testArray": Die Signatur des nicht privaten Members enthält den privaten Assemblytyp "kind".

error C3845: "pr5temp::MyForm::testArray": Nur statische Datenmember können innerhalb einer Verweisklasse oder eines Werttyps initialisiert werden.

+0

Показать минимальный код, который демонстрирует вашу ошибку. –

+1

Скопируйте * актуальную * и вставьте ее здесь, заполните и неотредактируйте. –

+0

Пытался перевести его, не уверен, если это точный смысл, извините. – agrypnie

ответ

1

Вы должны инициализировать поля в конструкторе.

... 
     private: 
      System::ComponentModel::Container ^components; 
      array<kind^> ^testArray; 
    ... 
    public ref class MyForm : public System::Windows::Forms::Form 
    { 
    public: 
     MyForm(void) 
     { 
      InitializeComponent(); 
      testArray= gcnew array<kind^>(100); 
     } 
    ... 

или даже сделать его статическим

static array<kind^> ^testArray = gcnew array<kind^>(100); 

, но имейте в виду, что элементы в массиве не был инициализирован.

+0

Хм, ваши советы верны, но этот код не инициализирует поле, он его присваивает. Инициализация выглядит так: MyForm (void): testArray (gcnew array (100)) {InitializeComponent(); } ' –

+0

@BenVoigt, спасибо за ваш комментарий. В будущем я буду (тщательно) внимательно относиться к терминологии –