【问题标题】:An issue with a non-member function非成员函数的问题
【发布时间】:2013-08-30 21:46:23
【问题描述】:

我正在处理的一个问题是要求我在类体内定义一个 istream 构造函数。让我们称这个类为 Sound。现在这个构造函数在它自己的主体中使用了一个函数。但是该函数应该是非成员函数。我在另一个文件中定义了它,但我在包含类定义本身的标头中声明了它。我已经将标题放在另一个包含非成员函数的文件中。

问题是,非成员函数的参数之一是 Sound 类型,它对 Sound 类型的对象执行操作。

当我在头文件中声明这个函数时,如果我把它放在类定义之前,我会得到一个错误,说对象还没有定义。

当我将声明放在定义之后,构造函数现在告诉我它的主体内的函数是未定义的。

如果我把声明放在类体内,它就变成了一个成员函数。

问题没有明确说明我不能使函数成为成员函数,所以我想知道是否有办法克服这个 catch-22。

【问题讨论】:

  • 可以帮到你,我也在考虑问题,不过请下次贴代码。考虑问题要容易得多。
  • define an istream constructor inside the class body 嗯?
  • @Lightness Races in Orbit:我也不清楚……
  • 我在 cpp 文件中具有遵循类定义的三个函数。
  • 所以我试着把这些放在定义之前,前面是一个结构 Sales_data;宣言。但是当我尝试编译时出现一些错误。错误表示架构重复符号。

标签: c++ function


【解决方案1】:

您不一定需要使函数成员。您至少可以有两种方法以不同的方式解决它。

问题是,如果我理解正确的话,您在尚未定义 Sound 对象的情况下拥有所有这些。

1) 你可以重构你的代码,如下所示。

header文件:

class Sound
{
public:
    Sound();

    doStuff();
}

cpp文件:

void non_member_function(Sound sound)

Sound::Sound() { non_member_function(*this); }
Sound::doStuff() {}

void non_member_function(Sound sound) { sound.doStuff(); }

2) 如果您坚持上述情况,您可以在非成员函数之前放置Sound sound 前向声明以获取类型识别。或者,您可以将声明放在类声明之后。

header文件:

class Sound
{
public:
    Sound();

    doStuff();
}

void non_member_function(Sound sound)

cpp文件:

Sound::Sound() { non_member_function(*this); }
Sound::doStuff() {}

void non_member_function(Sound sound) { sound.doStuff(); }

【讨论】:

    【解决方案2】:

    看起来最好的办法是在函数之前对类使用前向声明:

    标题:

    class Sound;
    
    void f(Sound s);
    
    class Sound
    {...};
    

    【讨论】:

      【解决方案3】:
      • 在 C++ 中,您可以将函数定义为成员函数或非成员函数。如果没有像您指出的那样指定或要求将函数定义为成员或非成员,那么我会选择一个简单或简单的解决方案。
      • 在构造函数中调用非成员函数可能需要您使用某种技术来进行此函数调用,现在如果函数被定义为成员函数,则可能不需要。

      【讨论】:

      • 他希望在没有成员函数的情况下解决它,因此上面的解释很长。
      • 只需要转发声明。
      猜你喜欢
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      相关资源
      最近更新 更多