C ++在头文件中声明实例变量,在源文件中调用构造函数

时间:2015-11-22 17:41:19

标签: c++ constructor initialization declaration definition

我现在学习C ++,据我所知,实例变量应该在Header文件中声明。示例标题(.hpp)如下所示:

class myClass {
private:
    int i;
    std::ifstream file;
    anotherClass aClassObj;
public:
    //methods
}

我想在源文件(.cpp)中初始化变量。仅限于它:

i = 4;

我如何为实例变量做到这一点?在Java中,它将是variableName = new Classname(ConstructorParam1, ConstructorParam2);

然而,这在C ++中是不可能的,因为file = new ifstream("filename");导致类型不匹配,因为new <...>;返回指针。 我应该改为file.open("filename");还是其他什么? 如何初始化变量aClassObj,我想调用带参数的构造函数?

亲切的问候

2 个答案:

答案 0 :(得分:1)

首先,你需要像在Java中那样为你的类(可能是多个重载的)创建构造函数。由于C ++基于值而不是指针作为Java(大多数情况下;某些基本类型如整数在Java中被视为值),因此通常不需要在C ++中使用new,除非您对动态有所了解多态性。你的类的构造函数可以看起来像这样(显然,它需要在myClass的类定义中声明):

myClass::myClass(int i, std::string const& name, AParam1 p1, AParam2 p2)
    : i(i)
    , file(name.c_str()) // if you use C++11 or later you can omit .c_str())
    , aClassObj(p1, p2) {
}

您没有指定类anotherClass的构造函数采用何种类型的参数。上面的代码假设有两个AParam1AParam2类型的参数。您很可能不需要从构造函数参数中获取所有参数,但已准备好值。例如,您可能始终希望使用值i初始化0成员,在这种情况下,您不需要参数,只需使用常量。

您要在C ++教程中查找的关键字是成员初始化列表:这是使用C ++初始化成员的方式。

答案 1 :(得分:0)

您可以使用无参数初始化实例,而不是使用参数调用构造函数,然后设置对象的属性。例如,在头文件中;

#include "anotherClass.h"    
class Myclass{
      public:
        MyClass();
        ~MyClass();
        int a;
        int b;
        anotherClass aClassObj;
      };

然后在MyClass.cpp文件的构造函数中;

MyClass::MyClass(){
   aClassObj.setParams(a, b);
}

同时,你的“anotherClass”在标题中有这种格式;

class anotherClass{
   public:
      anotherClass();
      ~anotherClass();
      int x;
      int y;
      void setParams(int a, int b);
};

并且.cpp文件具有此构造函数和set方法;

anotherClass::anotherClass(){
}
void anotherClass::setParams(int a, int b){
    x = a;
    y = b;
}