加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C多态与引用

发布时间:2020-12-16 10:43:49 所属栏目:百科 来源:网络整理
导读:我一直在用C编写一些操作文件的类.当我开始时,我让所有构造函数接受一个被解释为文件名的std :: string参数,因为这很快捷. 任何类使用的唯一函数std :: fstream是.open().我认为既然std :: ofstream和std :: ostringstream都来自std :: ostream而我只使用std
我一直在用C编写一些操作文件的类.当我开始时,我让所有构造函数接受一个被解释为文件名的std :: string参数,因为这很快捷.

任何类使用的唯一函数std :: fstream是.open().我认为既然std :: ofstream和std :: ostringstream都来自std :: ostream而我只使用std :: ostream的函数,那么让每个构造函数采用std :: ostream或std会好得多: :istream参数适当,而不是将类绑定到文件.

一个伟大的教科书例子,为什么多态是有用的.海湾合作委员会对此非常不满.这是我的代码的简化:

#include <iostream>
#include <fstream>

class Foo {
        public:
                Foo(std::istream&);
                std::istream& input;
};

Foo::Foo(std::istream& is) {
        this->input = is;
}

int main() {
        std::ifstream is("test.txt");
        Foo foo(is);
}

当使用g test.cpp编译时,产生以下各种各样的错误:

test.cpp: In constructor ‘Foo::Foo(std::istream&)’:
test.cpp:10:1: error: uninitialized reference member ‘Foo::input’ [-fpermissive]
In file included from /usr/include/c++/4.7/ios:43:0,from /usr/include/c++/4.7/ostream:40,from /usr/include/c++/4.7/iostream:40,from test.cpp:1:
/usr/include/c++/4.7/bits/ios_base.h: In member function ‘std::basic_ios<char>& std::basic_ios<char>::operator=(const std::basic_ios<char>&)’:
/usr/include/c++/4.7/bits/ios_base.h:791:5: error: ‘std::ios_base& std::ios_base::operator=(const std::ios_base&)’ is private
In file included from /usr/include/c++/4.7/ios:45:0,from test.cpp:1:
/usr/include/c++/4.7/bits/basic_ios.h:64:11: error: within this context
In file included from /usr/include/c++/4.7/iostream:41:0,from test.cpp:1:
/usr/include/c++/4.7/istream: In member function ‘std::basic_istream<char>& std::basic_istream<char>::operator=(const std::basic_istream<char>&)’:
/usr/include/c++/4.7/istream:56:11: note: synthesized method ‘std::basic_ios<char>& std::basic_ios<char>::operator=(const std::basic_ios<char>&)’ first required here 
test.cpp: In constructor ‘Foo::Foo(std::istream&)’:
test.cpp:11:16: note: synthesized method ‘std::basic_istream<char>& std::basic_istream<char>::operator=(const std::basic_istream<char>&)’ first required here

我无法筛选所有模板参数,但看起来它不喜欢这个 – > input = is;.每个类都能够作为成员访问流是很重要的,因为各种不同的成员函数都必须能够看到它.我认为GCC可能对指针更好一些,但对我来说,指向类的指针看起来像是动态分配的内存,我只想提出这些怀疑,如果它们是真的.什么是正确的方法?

解决方法

必须在 constructor initialization list中初始化引用类型的成员(以及const类型的成员):

Foo::Foo(std::istream& is) : input(is)
//                         ^^^^^^^^^^^
{
}

原因是您需要在使用它之前立即初始化引用.您原始代码中的内容是非法的,原因与此相同:

int y = 42;
int& x; // ERROR!
x = y;

另一方面,初始化列表保证在输入构造函数体之前,引用成员绑定到对象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读