如何用静态方法改变c++中对象的属性

How to change attribute of object in C++ from static method

本文关键字:对象 属性 c++ 何用 静态方法 改变      更新时间:2023-10-16

如何在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

也许这样:

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

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

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

静态成员函数不能访问非静态成员,因为不存在要引用其成员的对象。当然,您可以像建议的那样将对象的引用作为参数传递,但这很愚蠢,因为您还不如将函数设置为非静态成员。

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

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

试图使属性静态,但我得到错误:未定义的引用' Wrapper::attribute

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

  • 作为method参数的实例(参见Estiny的回答)
  • Wrapper的全局实例(不建议)
  • 使Wrapper为单例(通常不建议,但在某些情况下单例可以是一种解决方案)