小编Kur*_*dey的帖子

基类的虚拟朋友函数?

我正在学习语言,这是一个否定的怀疑.

是否可以使用虚拟朋友功能?我不知道是否可能,我甚至没有测试它,但它在某些情况下可能有用.例如,对于重载运算符<<().

DerivedClass dc;
BaseClass &rbc = dc;
cout << rbc;
Run Code Online (Sandbox Code Playgroud)

我的猜测是可能的,但我不确定,因为朋友的功能没有在类设计中实现,理论上也不是它的一部分(尽管在这个例子中,从概念上讲,运算符<<()应该是一个意义方法,但由于语法限制,不可能将其实现为一个).

编辑:我关心的是这个例子:

BaseClass bc;
DerivedClass dc;
BaseClass *pArr[2];
pArr[1] = bc;
pArr[2] = dc;
for (int i = 0; i < 2; i++)
    cout << pArr[i];
Run Code Online (Sandbox Code Playgroud)

在这个混合对象数组中,我想要为每个对象调用正确的运算符<<().

c++ virtual class function friend

11
推荐指数
3
解决办法
2万
查看次数

为重载运算符参数执行隐式转换时编译器错误

从书中做一些运动我遇到了疑问.我已经将一些运算符重载定义为类(Stonewt)的友元函数.问题来自这些原型:

friend ostream & operator<<(ostream &os, Stonewt &st);
friend Stonewt operator+(Stonewt &st1, Stonewt &st2);
Run Code Online (Sandbox Code Playgroud)

如果我依赖构造函数进行隐式转换并让编译器完成工作,如下所示(test1和test2是类对象):

cout << "Summing both weights: " << test1 + test2;
Run Code Online (Sandbox Code Playgroud)

我得到这样的错误消息:

无法将'std :: basic_ostream'左值绑定到'std :: basic_ostream &&'

初始化'std :: basic_ostream <_CharT,_Traits>&std :: operator <<的参数1(std :: basic_ostream <_CharT,_Traits> &&,const _Tp&)[with _CharT = char; _Traits = std :: char_traits; _Tp = Stonewt]'

OTOH,如果我执行以下操作,我不会收到任何错误:

Stonewt test3 = test1 + test2;
cout << "Summing both weights: " << test3;
Run Code Online (Sandbox Code Playgroud)

就像编译器获得Stonewt对象一样,它可以转换为Stonewt&(这就是函数所期望的).但如果它得到了其他的东西,它就无法到达Stonewt&.(同样的事情发生在其他运算符重载的其他实例中,如operator*,如果我放一个double并期望编译器通过构造函数将其转换为Stonewt然后到Stonewt&,它不起作用.我必须放一个Stonewt宾语).

这是正确的行为吗?有帮助吗?

我会把整个程序放在你需要的地方:

班级定义:

// stonewt1.h -- revised …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-errors operator-overloading friend-function implicit-conversion

1
推荐指数
1
解决办法
140
查看次数

cin.getline() 奇怪的行为

以下是练习一些类继承的书中的练习。但问题出在客户端,而不是类设计。(BaseCore、baseDMA、缺乏DMA 和hasDMA 是BTW 类)。

// usedma.cpp -- polymorphic example (compile with dma.cpp)

#include <iostream>
#include "dma.h" // includes <iostream>

const int ELEMENTS = 1;
const int LENGTH = 30;

int main()
{
    using std::cin;
    using std::cout;

    BaseCore *pArr[ELEMENTS];
    char tempDate[LENGTH];
    char kind;

    for (int i = 0; i < ELEMENTS; i++)
    {
        cout << "\nEntering data for element #" << i + 1 << "\n\n";
        cout << "Enter the date it was created: ";
        cin.getline(tempDate, LENGTH - 1);
        cout << …
Run Code Online (Sandbox Code Playgroud)

c++ queue user-input cin

1
推荐指数
1
解决办法
1245
查看次数

operator []歧义解决方案

诺布在这里.以下是我在书籍示例中遇到的类定义中的片段:

double& operator[](int i);
double operator[](int i) const;
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么这不模糊?编译项目的文件时,编译器不会给出任何错误.另外,在下面(想象AnyClass包含一个valarray<double>对象,例如我想直接访问它):

AnyClass test;
cout << test[2]
Run Code Online (Sandbox Code Playgroud)

编译器使用哪个版本?

c++ class operator-overloading ambiguity containment

1
推荐指数
1
解决办法
116
查看次数

void f()= 0是一个虚方法吗?

这里有一种否定的怀疑(另一个来自我:P)

关于我正在阅读的一本书:

  • 一个抽象基类(ABC)是通过纯虚方法的声明来实现的.
  • 使方法成为纯虚方法的原因在于= 0声明的最后.
  • 您可以将此声明为:virtual void f() = 0;这样您就不需要在ABC中定义它,但派生类必须实现它自己的版本.
  • 但是你也可以声明一个这样的虚方法:void f() = 0;这样你需要在ABC中定义方法,派生类可以像这样使用它.ABC需要这种方法,其方法通常由其派生类应用.

如果以上所有要点都是真的,我不明白的是:什么是虚拟方法?

因为void f() = 0;看起来像是我的常规方法.ABC将定义它,派生对象将使用ABC的定义,就像任何其他公共方法一样.是否存在对这两个实例具有吸引力的虚拟方法的定义?

纯虚函数或纯虚方法是一种虚函数,需要由非抽象派生类实现

此定义是从本网站的另一个问题中挑选出来的.所以我的猜测是我读的那本书错了吗?void f() = 0;声明该类是ABC,但它不是纯虚方法.有人可以证实这一点或向我解释一下吗?

c++ methods virtual abstract-class derived-class

0
推荐指数
1
解决办法
1189
查看次数