【问题标题】:How to change attribute of object in C++ from static method如何从静态方法更改 C++ 中对象的属性
【发布时间】:2015-09-09 11:58:28
【问题描述】:

如何从 C++ 中的静态方法更改对象属性?我的方法必须是静态的。

代码:

class Wrapper
{
    private:
        double attribute; //attribute which I want to change
    public:
        Wrapper();
        ~Wrapper();
        static void method(double x);
}

我试过了:

std::string Wrapper::method(double x)
{
    attribute = x;
}

但是:

error: invalid use of member ‘Wrapper::attribute’ in static member function

【问题讨论】:

  • 假设你有 10 个 Wrapper 对象,这个静态方法怎么知道应该修改哪一个? :) 如果您真的想要这个,请将 Wrapper 对象引用传递给方法函数。
  • 这是一种对象,只会被创建一次。
  • 那为什么不简单地将attribute 也设为静态呢?或者也许将班级变成单身人士?
  • @wair92 对于这个问题,这里有数百个问题和答案,更不用说更大的互联网上的数千个问题了。
  • @wair92:你应该在某个地方定义你的静态变量。

标签: c++ static-methods


【解决方案1】:

也许这样:

std::string Wrapper::method(double x, Wrapper& obj)
{
    obj.attribute = x;
}

但如果你有这样的问题,你应该重新考虑你的设计。引用类实例的方法没有理由是静态的。

静态方法不与类的任何实例相关联,而是与类本身相关联。编译器不知道,这个类只有一个实例。您的问题有很多可能的解决方案,但正确的解决方案取决于您想要在更大范围内实现的目标。

【讨论】:

    【解决方案2】:

    静态成员函数无法访问非静态成员,因为没有您要引用其成员的对象。当然,您可以按照建议将对象的引用作为参数传递,但这很愚蠢,因为您不妨将函数设为非静态成员。

    它是一种对象,只会被创建一次。

    最简单的解决方案是使成员static。 static 成员可以在没有对象的情况下访问,因为 static 成员为所有实例共享。

    试图将属性设为静态,但出现错误:未定义对 `Wrapper::attribute 的引用

    这意味着你忘记定义变量了。

    【讨论】:

    • 但是您必须考虑,这种类型的所有实例都将共享相同的属性。因此,如果您更改“一个”实例的属性,它也会在其他任何地方更改。
    • @KiraSama 像这样:double Wrapper::attribute;
    • @user2079303 是的,抱歉删除问题,在你评论之前我很快就知道了,这和定义静态函数一样,谢谢顺便说一句。
    【解决方案3】:

    method 是一个类方法,attribute 是一个实例变量。在您当前的设计中调用method 时,没有实例,因此也没有attribute。更改实例变量(如attribute)的唯一方法是将Wrapper 的实例提供给method。有几种可能的解决方案。一些想法:

    • 一个实例作为method 的参数(参见Estiny 的回答)
    • Wrapper 的全局实例(不建议)
    • make Wrapper a singleton(一般不建议,但在某些情况下可以使用单例)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多