如何在没有实例化的情况下访问成员变量,C ++

时间:2014-03-10 13:13:04

标签: c++ class inheritance constructor static-members

假设我有一个B类,它在另一个类A的构造函数中得到一个值'v'。如何从C类中读取这个值? C类将按需实例化,但A已经创建了B并且已经传递了'v'。 'v'将在每个实例中发生变化。我试图在B类中使'v'静态。它会起作用吗?我无法正确实施它。

Class A {
 public:
 int* v;
 B b1;
 A(int* var) : v(var), b1(var) {};
}

如何从C类访问相同版本的'v'?  我可以定义B和C然而我喜欢为了达到目标。但是我不能为此目的改变A.

2 个答案:

答案 0 :(得分:4)

您需要一个(公共)静态成员

class A { //let's stick with your naming convention!
public:
  static int a;
}

A::a = 4;

然而,允许人们改变A :: a意味着你的程序可能最终依赖于全局未封装的状态......这通常是设计糟糕的标志。

如果你的成员是const,那么你真的将一个常数与你的班级联系起来,这并不是那么糟糕。

class A {
public: 
  static const int a = 4;
}

std::cout << "A:a is always " << A::a << std::endl;

基于更新问题的编辑 如果您需要帮助建立课程,我建议您使用某种工厂。如果我理解您的要求,您希望能够为每个A类和B类实例注入一个值。该值“v”基于C类。

因此...

class C {
private:
  // up to you where you implement the getUniqueNumberForNow function
  // (global free function for example)
  static const int v = getUniqueNumberForNow();
public:
  static A createA(){
    return A(v);
  }
  static B createB(){
    return B(v);
  }
}

getUniqueNumberForNow()函数只会获得您应有的价值。然后,它会存储在class C中,并可在创建A和\ B期间使用。现在只需将AB的CTOR设为私有,并使C成为friend两者,您将只有一种方法可以创建A或{ {1}},它将始终使用正确的值。

有关朋友类的信息,请参阅以下评论中的NeilMonday链接。

最后一件事是,如果您想要为B的每个实例化更改值,您可以在工厂中执行此操作:

A

但是,如果真的你想要什么,那么就这样做:

  static A createA(){
    return A(getUniqueNumberForNow());
  }

答案 1 :(得分:1)

您无法访问从未传递给班级的'v'。相反,您可以将它的静态副本作为A类中的成员。它将在每次实例化A时更新:

Class A {
 public:
   int* v;
   static int* staticv;
   ...// Constructor etc
}

在您的.cc代码中:

int* A::staticv;
...
A::staticv=this->v;

现在任何类都可以通过以下方式访问此值:

A::staticv;