【问题标题】:static members and encapsulation in c++C++中的静态成员和封装
【发布时间】:2013-12-12 10:06:25
【问题描述】:

让我们假设以下类:

class FileManipulator
{
    static InputTypeOne * const fileone;
    InputTypeTwo *filetwo;

    public:
    FileManipulator( InputTypeTwo *filetwo )
    {
        this->filetwo = filetwo;
    }
    int getResult();
};

FileManipulator 使用两个文件中的数据从getResult() 获取输出。这意味着对filetwo 的多次迭代和FileManipulators 的多次构造通过对不同InputTypeTwo 对象的迭代。让我们说,输入是一些 .csv 数据库。 InputTypeOne 在整个任务中保持不变。

程序本身是多模块的,上面的操作只是它的小单元。

我的问题是如何根据面向对象的范式和封装来处理 static 字段。该字段必须以某种方式初始化,因为它不是不同程序执行的固定值。据我了解 C++ 规则,我无法创建用于设置字段的方法,但在我看来,将其公开并在任何类(FileManipulator 或结识的类)之外对其进行初始化似乎与封装不一致。

那我该怎么办?我想到的唯一一件事就是以 C 方式进行,即在一个足够隔离的编译单元中对其进行初始化。这真的是我能做的吗?如何以专业的方式解决?

编辑

我将指向常量的指针更正为常量指针,这是我的初衷。

【问题讨论】:

  • static 成员也可以是protectedprivate
  • 我知道,但是我该如何初始化它们呢?
  • 如何初始化非静态成员?
  • 从描述中真的不清楚为什么你甚至想要使用静态字段,而不是成员变量。我读过的大多数 OO 文本都对类变量皱眉,这是静态提供的。
  • 在构造函数中。重点是静态成员初始化不能放在任何函数体中。

标签: c++ encapsulation static-members static-initialization


【解决方案1】:

您可以编写 FileManipulator 的公共静态方法来为您初始化字段:

static void init()
{
  fileone = something();
}

然后从 main() 或正在初始化程序的某个地方调用它。

【讨论】:

  • @infoholic_anonymous 你为什么这么认为?
  • @Constructor 如果你尝试编译它,你会得到一个链接器错误。您必须先创建静态变量,然后才能为其赋值。见stackoverflow.com/questions/185844/…
  • @infoholic_anonymous 当然,你也应该这样写:const InputTypeOne *FileManipulator::fileone;*.cpp 文件中。还有?
  • @Constructor 你读过这个问题吗?我确实在那里说它似乎与封装不一致,因此可能存在不必要的风险。通常,您将此类内容保密以限制访问。我问是否在编译单元中使其全局化是唯一的解决方案。
  • @infoholic_anonymous 它会工作。不要混淆常量指针和指向常量的指针。最后一个在您的代码中使用,它不是常量。
【解决方案2】:

想到的一种方法是:

在.cpp文件中

FileManipulator::fileone = NULL;

然后修改构造函数进行如下操作:

FileManipulator( InputTypeTwo *filetwo,  InputTypeOne  *initValue = NULL)
{
    if(fileone == NULL)
    {
        fileone = initValue;
    }
    this->filetwo = filetwo;
 }

或者您也可以定义一个 init 函数并确保在使用类之前和 CTOR 之后调用它。 init 函数将包含如何初始化 fileone 的逻辑。

【讨论】:

  • 这样的初始化函数如何工作?我读了stackoverflow.com/questions/185844/…,因为我无法初始化函数体中的静态成员。
  • 您可以从非静态函数调用静态函数。换一种方式是行不通的。我的建议类似于在构造函数中编写的代码,只是移动到一个只执行一次初始化的辅助函数。 (如果进行任何后续调用,则不会执行任何操作)
猜你喜欢
  • 1970-01-01
  • 2014-02-04
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
相关资源
最近更新 更多