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

Com*_*guy 1 c++ inheritance constructor class 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) {};
}
Run Code Online (Sandbox Code Playgroud)

如何从 C 类访问相同版本的“v”?我可以定义 B 和 C,但是我喜欢以实现目标。但我不能为此目的更改 A。

Den*_*nis 5

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

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

A::a = 4;
Run Code Online (Sandbox Code Playgroud)

但是,允许人们更改 A::a 意味着您的程序可能最终会依赖于全局未封装状态……这通常是设计不佳的标志。

const但是,如果您的成员是,那么您确实将一个常量与您的类相关联,这还不错。

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

std::cout << "A:a is always " << A::a << std::endl;
Run Code Online (Sandbox Code Playgroud)

根据更新的问题进行编辑 如果您在构建类时需要帮助,我建议您使用某种工厂。如果我理解您的要求,您希望能够将一个值注入到每个 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

getUniqueNumberForNow()函数只是获取您应有的任何值。然后它将被存储在中class C并可在创建Aan\or期间使用B。现在只需将AandB的 CTOR 设为私有并将两者都设为Ca friend,您将只有一种方法来创建Aor B,并且它将始终使用正确的值。

有关好友课程的信息,请参阅下面评论中的 NeilMonday 链接。

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

  static A createA(){
    return A(getUniqueNumberForNow());
  }
Run Code Online (Sandbox Code Playgroud)

但是,如果这确实是您想要的,那么只需执行以下操作:

class A {
public:
  A() : val (getUniqueNumberForNow()), b(B(val)){}
}
Run Code Online (Sandbox Code Playgroud)