声明一个带有构造函数参数的成员变量

时间:2011-09-12 23:22:07

标签: c++ constructor g++ declaration member-variables

 // In A.h
 class A
 {
  public:
    enum eMyEnum{ eOne, eTwo, eThree };
  public:
    A(eMyEnum e);
 }

 // In B.h
 #include "A.h"
 class B
 {
    B();
    private:
       A memberA;
 }

 // In B.cpp
#include "B.h"
 B::B(void) : memberA(A::eOne)
 {}

'memberA'的声明使用g ++编译器给出了编译错误: 错误:'A :: eOne'不是类型

我怎样才能克服这一点?我只需要创建一个不带参数的默认构造函数吗?

4 个答案:

答案 0 :(得分:8)

听起来您正在尝试初始化成员变量。你可以这样做:

class B
{
public:
    B() : memberA(A::eOne) {}  // Initializer list in constructor
private:
    A memberA;
};

答案 1 :(得分:1)

class B
{
    public:
    B(A::eMyEnum someValue = A::eOne) : memberA(someValue) {};

    private:   
    A memberA;
}

答案 2 :(得分:1)

A构造函数需要eMyEnum。目前尚不清楚为什么你希望B的构造函数也不接受eMyEnum参数。无论如何,假设你的目标是将参数传递给A的构造函数A::eOne(而不是A::eMyEnum::eOne),你可以试试下面的代码,使用typedef

#include <iostream>
using namespace std;

class A {
public:
    typedef enum { eOne, eTwo, eThree } eMyEnum;
public:
    A(eMyEnum e) {
        cout << "A ctor" << endl;
    }
};

class B {
public:
    B() : memberA(A::eOne) {
        cout << "B ctor" << endl;
    }
private:
    A memberA;    

};

int main() {
    B b;
}

// output
A ctor
B ctor

但请注意,memberA的构造函数始终使用参数A::eOne调用。您还没有展示如何在构造函数中使用此参数,但我假设在您的实际代码中它初始化了A的成员。如果成员必须始终具有相同的值,请将其设为const并从构造函数中删除该参数。

答案 3 :(得分:0)

eOne不是类型,eMyEnum是类型。你基本上说的是“你必须将文字2传递给这种方法” - 它没有任何意义。如果你不打算将枚举传入其中,你就必须澄清你的目标。