【问题标题】:Access non static data member outside class访问类外的非静态数据成员
【发布时间】:2013-03-17 19:52:36
【问题描述】:

是否可以访问类外的非静态数据成员?假设您有如下示例。我知道作为示例没有多大意义,但我只想了解如何访问非静态数据成员。如果编译以下内容会产生错误:

 C.h|70|error: invalid use of non-static data member ‘C::age’|

//C.h

class C{
  public:
    int age;
};
 int getAge();

//C.cpp

C::C()
{
    age  = 0;
}
int getAge(){
   return (C::age);
}

【问题讨论】:

  • int C::getAge() 可能会更好。在类中移动 getter。
  • 类的重点是每个实例都是独立的。您要返回哪个实例的age
  • @WhozCraig 我知道,我知道。假设我需要该类之外的该功能。有没有办法解决我的错误?
  • @chris C 类年龄的实例
  • @FranXh,您必须意识到这毫无意义。您可以创建任何不同的 C 对象,每个对象都有自己的 age。如果您想要一个 age 用于所有实例(或从无实例访问),您必须将 age 设为静态。

标签: c++ non-static datamember data-members


【解决方案1】:

非静态成员依赖于实例。它们在初始化有效实例时被初始化。

您的示例的问题在于,它尝试通过类接口访问非静态成员,而无需先初始化具体实例。这是无效的。

你可以选择static:

class C{
public:
    static int age;
};

这要求您在运行时使用之前还定义ageint C::age = 0。请注意,如果使用此方法,C::age 的值可以在运行时更改。

或者,您可以将其设为const static 并直接将其初始化为:

class C{
public:
    const static int age = 0;
};

在这种情况下,C::age 的值为const

这两者都可以让您在没有实例的情况下获得它:C::age

【讨论】:

  • 我的年龄值会改变,所以我不能将其声明为常数。我认为将其设为静态将是最好的方法,但是当我执行 int C::age = 0 时,会出现如下错误: C.cpp|5|error: invalid use of qualified-name 'C::age'|
【解决方案2】:

如果不使其成为静态,则必须创建一个值:

左值:

C c;

return c.age;

或右值:

return C().age;
// or
return C{}.age;

您的代码的问题是您尝试访问age 成员而不创建类的实例。类的非静态数据成员只能通过类的实例访问,在您的情况下,不会创建任何实例。

【讨论】:

  • 我确实有一个构造函数,我声明age=0
  • @FranXh 哎呀。谢谢,我没看到。
【解决方案3】:

你不能这样做的原因是因为局部变量是在运行时分配到堆栈上的——如果你真的想用一些内联汇编来获取它的位置,但它需要一些调试来获取堆栈位置和以后(在函数之后)您想要访问它的可能性越大,它很可能早就被其他东西覆盖了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多