Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 写入子类中的文件(此处首先需要X的隐式复制构造函数)_C++_Inheritance_Constructor - Fatal编程技术网

C++ 写入子类中的文件(此处首先需要X的隐式复制构造函数)

C++ 写入子类中的文件(此处首先需要X的隐式复制构造函数),c++,inheritance,constructor,C++,Inheritance,Constructor,我试图在派生类中创建一个文件,但收到下面的错误消息 我的代码: #include <string> #include <fstream> class Animal { public: Animal(); ~Animal(); protected: std::string name; }; class Cat : public Animal { public: Cat(std::string const &filename);

我试图在派生类中创建一个文件,但收到下面的错误消息

我的代码:

#include <string>
#include <fstream>

class Animal
{
public:
    Animal();
    ~Animal();

protected:
    std::string name;
};

class Cat : public Animal
{
public:
    Cat(std::string const &filename);

private:
    std::ofstream _file;
};

Cat::Cat(std::string const &filename) : _file(filename.c_str(), std::ios::out)
{
    this->_file.open(filename);
}

int main()
{
    Cat c1 = Cat("cat.txt");
}
#包括
#包括
类动物
{
公众:
动物();
~Animal();
受保护的:
std::字符串名;
};
猫类:公共动物
{
公众:
Cat(std::字符串常量和文件名);
私人:
std::ofstream\u文件;
};
Cat::Cat(std::string const&filename):\u文件(filename.c\u str(),std::ios::out)
{
此->\u文件。打开(文件名);
}
int main()
{
类别c1=类别(“Cat.txt”);
}
我得到了以下错误

    In file included from animal.cpp:3:
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/fstream:169:
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/ostream:139:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/streambuf:486:64: error: base class 'std::__1::ios_base' has
      private copy constructor
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ios<char>)
                                                               ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/iosfwd:133:32: note: in implicit copy constructor for
      'std::__1::basic_ios<char>' first required here
    class _LIBCPP_TEMPLATE_VIS basic_ofstream;
                               ^
animal.cpp:15:7: note: in implicit copy constructor for 'std::__1::basic_ofstream<char, std::__1::char_traits<char> >' first required here
class Cat : public Animal
      ^
animal.cpp:34:14: note: in implicit copy constructor for 'Cat' first required here
    Cat c1 = Cat("cat.txt");
             ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/ios:313:5: note: declared private here
    ios_base(const ios_base&); // = delete;
    ^
1 error generated.
包含在animal.cpp:3中的文件中:
在/Applications/Xcode.app/Contents/Developer/Toolchains/xcodefault.xctoolchain/usr/include/c++/v1/fstream:169中包含的文件中:
在/Applications/Xcode.app/Contents/Developer/Toolchains/xcodefault.xctoolchain/usr/include/c++/v1/ostream:139中包含的文件中:
/Applications/Xcode.app/Contents/Developer/toolschains/XcodeDefault.xctoolschain/usr/include/c++/v1/streambuf:486:64:错误:基类“std::\uu 1::ios\u base”已
私有副本构造函数
_LIBCPP外部模板(类LIBCPP外部模板类型与基本ios)
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/iosfwd:133:32:注意:在
这里首先需要“std::_1::basic_ios”
类_LIBCPP_TEMPLATE_VIS basic_of stream;
^
animal.cpp:15:7:注意:在隐式复制构造函数中,这里首先需要'std::u 1::basic_of stream'
猫类:公共动物
^
animal.cpp:34:14:注意:此处首先需要“Cat”的隐式复制构造函数
类别c1=类别(“Cat.txt”);
^
/Applications/Xcode.app/Contents/Developer/toolschains/XcodeDefault.xctoolschain/usr/include/c++/v1/ios:313:5:注意:此处声明为私有
ios_base(const ios_base&);/=删除;
^
生成1个错误。

无法复制流
Cat
包含流,因此无法复制
Cat
<代码>Cat c1=Cat(“Cat.txt”)并不真正复制一个
Cat
,但它要求
Cat
可以复制。替换:
Cat c1(“Cat.txt”)这不应该是C++11之后的错误,因为
catc1=Cat(“Cat.txt”)可以在C++11及更高版本中使用移动构造函数。您是否有意使用旧的C++03甚至C++98?(如果是这样,你可能应该标记它。如果不是这样,你的编译器配置错了。)@EmmetB不,我不这么认为。(我猜clang-902.0.39.2就是clang 9)你可能给了你的编译器一个类似于
-std=c++98
之类的标志,手动或通过IDE/build设置。不是太旧,但你可能需要添加一个额外的编译器选项,让编译器根据最新标准中的新规则来编译程序。我不知道XCode值豆子,但是应该有一个配置选项,允许你设置C++标准修订版或方言。@ EMETB如果只是一个坏的做法,因为你重复了<代码> CAT/COD>两次。由于C++17(您可能应该使用它而不是
-std=C++11
),它们甚至可以保证做同样的事情。另一种选择是
autoc1=Cat(“Cat.txt”)如果你喜欢的话。(仅拼写一次类型,
auto
由编译器推导。)您选择哪种类型主要取决于样式。