首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >非成员函数的问题

非成员函数的问题
EN

Stack Overflow用户
提问于 2013-08-30 13:46:23
回答 3查看 496关注 0票数 2

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

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

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

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

如果我将声明放入类体中,它将成为一个成员函数。

这个问题并没有明确说明我不能让这个函数成为一个成员函数,所以我想知道是否有一种方法可以克服这个捕获-22。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-30 15:54:32

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

标题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Sound;

void f(Sound s);

class Sound
{...};
票数 1
EN

Stack Overflow用户

发布于 2013-08-30 13:53:27

您不一定需要使函数成员。你至少可以有两种不同的方法来解决这个问题。

问题是,如果我正确理解的话,在声音对象还没有被定义的情况下,所有这些都是存在的。

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

header文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Sound
{
public:
    Sound();

    doStuff();
}

cpp文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Sound
{
public:
    Sound();

    doStuff();
}

void non_member_function(Sound sound)

cpp文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Sound::Sound() { non_member_function(*this); }
Sound::doStuff() {}

void non_member_function(Sound sound) { sound.doStuff(); }
票数 2
EN

Stack Overflow用户

发布于 2013-08-30 14:56:50

  • 在c++中,可以将函数定义为成员函数或非成员函数。如果您已经指出,没有指定或要求将函数定义为成员或非会员,那么我将选择一个简单或简单的解决方案。
  • 在构造函数中调用非成员函数可能需要使用某种技术来进行函数调用,如果函数被定义为成员函数,则可能不需要调用。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18541925

复制
相关文章
静态成员函数和非静态成员函数的区别?
一个静态成员函数不与任何对象相联系,故不能对非静态成员进行默认访问。 它们的根本区别在于静态成员函数没有this指针,而非静态成员函数有一个指向当前对象的指针this。 例如: 1 class Sc 2 { 3 public: 4 void nsfn(int a); //像声明Sc::nsfn(Sc *this , int a); 5 static void sfn(int a); // 无this指针 6 //.... 7 }; 8 9 void f(Sc
猿人谷
2018/01/17
1.9K0
静态成员函数访问非静态数据成员【C++】
详解:由于静态数据成员属于本类的所有对象共享,不属于特定类对象,因此在未产生类对象时作用域就可见,即:在未产生类的实例时,就可以对它进行操作。
攻城狮杰森
2022/06/03
1.3K0
C++类的成员函数 | 成员函数
在C++中,类的成员函数是函数的一种,它有返回值和函数类型,它与一般函数的区别只是:
小林C语言
2021/01/18
1.9K0
C++类的成员函数 | 成员函数
【非原创】C++类成员函数的重载、覆盖和隐藏
B、重载是指派生类函数覆盖基类函数,函数相同,参数相同,基类函数必须有virtual关键字
xiaoxi666
2018/10/29
6910
2021-04-14 quickjs调用类的非静态成员函数
有这样一个需求:多线程条件下执行交易,每个交易都会通过quickjs回调c++代码的函数,而这个函数使用的数据又来自于当前的交易 首先不考虑用全局变量来保存交易的数据,因为js回调c函数的时候我们无法在回调函数中区分当前属于哪个交易,如果你总是把交易的id通过回调函数传递过来也是可以实现,只是这样函数就多了个参数,写js代码的人无法理解。 一个简单的思路是c代码创建交易的类,然后把类的函数传递给quickjs,然后在js中调用这个类的函数,但是这个实现不了,因为quickjs没有注入非静态成员函数的接口,其原因文章非static成员函数通过类名::来调用,空指针调用成员方法不出错!讲解的比较清楚 换个思路,我们先用js创建这个类,然后调用eval把类的数据传递给它,这样调用这个类的非静态成员函数的时候就可以正确访问到数据了,我们直接修改文件example.cpp 具体实现如下:
oracle3
2022/04/22
1K0
【C++】静态成员函数 ( 静态成员函数概念 | 静态成员函数声明 | 静态成员函数访问 | 静态成员函数只能访问静态成员 )
静态成员函数归属 : 在 C++ 类中 , 静态成员函数 是一种 特殊的函数 , 该函数属于类 , 而不是属于 类实例对象 ;
韩曙亮
2023/10/15
1.6K0
【C++】静态成员函数 ( 静态成员函数概念 | 静态成员函数声明 | 静态成员函数访问 | 静态成员函数只能访问静态成员 )
成员函数
输入n个学生的信息,每个学生的信息包括姓名、身高、学号。变成输出身高最高的学生信息。
全栈程序员站长
2022/09/07
5800
C++中const和非const对象分别调用const和非const成员函数
我们知道c++在类的成员函数中还会隐式传入一个指向当前对象的this指针,所以在test类中,实际的print函数应该是这样的void print(test * this);,这代表一个指向test对象的指针this被传入到了print函数中
早起的鸟儿有虫吃
2023/03/21
1.4K0
C++中const和非const对象分别调用const和非const成员函数
C++编程规范(二)/优先编写非成员非友元函数
非成员非友元函数通过尽量减少依赖提高封装性,实现加法操作符重载比较: 一:成员函数 #include <iostream> using namespace std; template <typename T> class Add { public: Add(T,T); Add(){} Add operator +( const Add<T> &); private: T a,b; }; template <typename T> A
用户9831583
2022/06/16
3260
C++编程规范(二)/优先编写非成员非友元函数
Python 检测成员函数、成员变量是否存在的方法
AttributeError: A instance has no attribute 'fun2'
用户9127725
2022/08/08
2.8K0
C++中的const成员变量和成员函数
在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定。const 可以用来修饰成员变量和成员函数。
芯动大师
2023/10/14
3260
C++中的const成员变量和成员函数
【Python】面向对象 ③ ( 构造函数 | 成员变量赋值问题 | 构造方法引入 | 构造函数可以同时定义成员变量 )
如果要为其成员变量赋值 , 需要分别为 name 和 age 两个成员变量赋值 ,
韩曙亮
2023/10/11
3670
【Python】面向对象 ③ ( 构造函数 | 成员变量赋值问题 | 构造方法引入 | 构造函数可以同时定义成员变量 )
C++类的静态数据成员和静态成员函数
一些类对象可能会具有一些相同的属性,如果用普通数据成员来描述这些相同的属性,这意味着我们需要给每个对象的这个数据成员设定相同的值,如果改变类对象相同的属性,那么意味着我们需要对它们统一操作,这就有可能出现它们的值会不一样的情况,如果用全局变量来描述它们相同的属性,就会破坏类的独立性。
叶茂林
2023/07/30
2050
C++ 静态数据成员与静态成员函数
本文介绍了静态数据成员和静态成员函数的概念、特点以及用法,并给出了一个示例代码。静态数据成员和静态成员函数是C++中比较重要的概念,在开发中经常用到。
chaibubble
2018/01/02
1.5K0
C++:30 ---C++类成员,成员函数的内存布局
这里要指出的是大家可以看到静态成员函数和静态成员变量sx的地址都是0x00007FF开头的,实际上他们都在全局数据区域存储(全局变量,静态变量),如果你有耐心,可以断点查看下栈空间内的局部变量i的地址:
用户3479834
2021/02/03
1.3K0
C++:30 ---C++类成员,成员函数的内存布局
static修饰的成员变量及函数
static成员变量又称为静态成员变量,在多个对象间共享使用,并且static静态变量在初始化时必须在类外初始化,可以直接通过“类名::变量”访问,哪怕是还没有生成对象时一样可以访问,以此看来static成员变量不隶属于某个对象,而隶属于类,只是所有该类的对象都可以使用而已。
我与梦想有个约会
2023/10/20
1760
static修饰的成员变量及函数
静态成员和函数的初步运用
商店销售某一商品,每天公布统一的折扣(discount)。同时允许销售人员在销售时灵活掌握售价(price),在此基础上,一次购10件以上者,还可以享受9.8折优惠。现已知当天m个销货员销售情况为
布衣者
2021/09/07
5880
C++静态成员变量和静态成员函数小结
静态类成员包括静态数据成员和静态函数成员两部分。 一 静态数据成员: 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时,静态数据成员还具有以下特点: 1.静态数据成员的定义。 静态数据成员实际上是类域中的全局变量。所以,静态数据成员需要在类外定义(初始化),而不应该被放在类声明中。 原因是类声明中只是描述如果分配内存并不会真正的分配内存,而定义是一定要分配
用户1215536
2018/02/05
1.9K0
类A的成员函数做类B的友元函数
这种方法相对麻烦,主要是在两个类之间的前后声明有着复杂的逻辑关系。但只要我们理清思路,是可以实现的。跟着我从最初的想法到实现一步一步的理顺逻辑,就非常容易理解如何操作了。
我与梦想有个约会
2023/10/20
1590
类A的成员函数做类B的友元函数
震惊!_类内成员函数可以访问本类对象的私有成员
私有成员是head,有一个成员函数的形参是本类对象(的引用,引不引用不影响结论和原因)
用户10551528
2023/05/09
8640
震惊!_类内成员函数可以访问本类对象的私有成员

相似问题

(简单?)指向非静态成员函数问题的指针

30

非静态成员的静态成员函数

14

对非对象上的成员函数的->调用问题

21

成员函数非对象

31

在非对象问题上调用成员函数

26
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文