4
//Parent.h
class Parent{
public:
   Parent(){}
   ~Parent(){}
   virtual void func1() = 0;
};

//Child.h
#include "Parent.h"
class Child : public Parent{
  int x, y;
public:
  Child() : Parent(){ //constructor

  }
  virtual void func1();
};

//Child.cpp
#include "Child.h"
void Child::Parent::func1(){

}

これは正常にコンパイルされますが、Child クラスのコンストラクタ (およびデストラクタ) の実装をその cpp ファイルに入れたいのですが、可能ですか? どのように?

以下のコードを試しましたが、Child の vtable への未定義の参照がスローされます

Child::Child() : Parent(){  //in the cpp
}

Child(); //in the header file 
Child():Parent(); //also tried this one
4

2 に答える 2

3

あなたがするべきいくつかのこと:

  • 意図しない複数のインクルードを防ぐために、ヘッダー ファイルをガードポストします。
  • 親デストラクタを仮想にする
  • 非自動メンバー変数を初期化して値を決定します。

最終的なレイアウトは次のようになります。

Parent.h

#ifndef PARENT_H_
#define PARENT_H_

class Parent
{
public:
    Parent() {};
    virtual ~Parent() {};

public:
    virtual void func1() = 0;
};

#endif // PARENT_H_

Child.h

#ifndef CHILD_H_
#define CHILD_H_

#include "Parent.h"

class Child : public Parent
{
    int x,y;

public:
    Child();
    virtual ~Child();

    virtual void func1();
};
#endif

チャイルド.cpp

Child::Child()
   : Parent()     // optional if default
   , x(0), y(0)   // always initialize members to determinate values
{
}

Child::~Child()
{
}

void Child::func1()
{
}
于 2012-11-27T06:27:00.413 に答える
0
$ cat Parent.h 
#ifndef GUARD_PARENT_H_
#define GUARD_PARENT_H_

class Parent{
public:
   Parent(){}
   ~Parent(){}
   virtual void func1() = 0;
};

#endif /* GUARD_PARENT_H_ */
$ cat Child.h
#ifndef GUARD_CHILD_H_
#define GUARD_CHILD_H_

#include "Parent.h"

class Child : public Parent{
  int x, y;
public:
  Child();
  virtual void func1();
};

#endif /* GUARD_CHILD_H_ */
$ cat Child.cpp
#include "Child.h"

Child::Child() : Parent() {
}

void Child::func1(){
}
$ cat try.cc
#include "Child.h"

int main() {
        Child c;
}
$ g++ try.cc Child.cpp
$ ./a.out
$
于 2012-11-27T06:10:41.483 に答える