0

私は次の構造を持っています:

template <class T>
struct Array{
    int lenght;
    T * M;

    Array( int size ) : lenght(size), M(new T[size])
    {
    }

    ~Array()
    {
       delete[] M;
    }
};

そしてクラス(構造を満たすオブジェクトの):

class Student{

private:
int ID;
int group;
char name[];
 public:

     Student();
     ~Student();

    void setStudent(int,int,char){

    }

    char getName(){
        return *name;
    }

    void getGroup(){

    }

    void getID(){

    }

};

ここで、配列型を初期化したい場合、Main.cpp で次のようになります。

#include <iostream>
#include "Domain.h"
#include "Student.h"
//#include ""

using namespace std;

int main(){
    cout<<"start:"<<endl<<endl;

    Array <Student> DB(50);
    Array <Student> BU(50);


    return 0;
}

エラー:

g++ -o Lab6-8.exe UI.o Repository.o Main.o Domain.o Controller.o
Main.o: In function `Array':
D:\c++\Begin\Lab6-8\Debug/..//Domain.h:16: undefined reference to `Student::Student()'
D:\c++\Begin\Lab6-8\Debug/..//Domain.h:16: undefined reference to `Student::~Student()'
Main.o: In function `~Array':
D:\c++\Begin\Lab6-8\Debug/..//Domain.h:21: undefined reference to `Student::~Student()'

理由はありますか?

4

2 に答える 2

3

あなたが書くとき:

class Student
{
public:
   Student();
   ~Student();
};

クラスコンストラクタとデストラクタを明示的に宣言したため、コンパイラはそれらを定義しませんでした-それらの定義(実装)を提供する必要があります。些細なケースでは、これは仕事をします:

class Student
{
public:
   Student(){};
   ~Student(){};
};
于 2012-04-30T16:13:02.973 に答える
1

これは、 のコンストラクタとデストラクタを宣言しましたが、それらの定義Studentが欠落しているためです。

Studentこれらの定義は、おそらく .h ファイルで、の宣言の一部としてインラインで提供できます。

Student() {
    // initialize the student
}
~Student() {
    // release dynamically allocated parts of the student
}

またはcppファイルのクラス宣言の外:

Student::Student() {
    // initialize the student
}
Student::~Student() {
    // release dynamically allocated parts of the student
}

補足として、本当に 1 文字の名前が必要でない限り、nameおそらく である必要があります。std::stringchar

于 2012-04-30T16:11:59.967 に答える