C++ C++;构造函数继承(从派生类调用构造函数)

C++ C++;构造函数继承(从派生类调用构造函数),c++,inheritance,boost,constructor,C++,Inheritance,Boost,Constructor,继承/调用基类的构造函数时遇到问题。我以Boost.Asio为例建立了这个类 下面是家长课程: #ifndef CLIENT_HPP #define CLIENT_HPP #include <iostream> #include <memory> #include <utility> #include <boost/asio.hpp> #include <boost/lexical_cast.hpp> using boost::as

继承/调用基类的构造函数时遇到问题。我以Boost.Asio为例建立了这个类

下面是家长课程:

#ifndef CLIENT_HPP
#define CLIENT_HPP

#include <iostream>
#include <memory>
#include <utility>
#include <boost/asio.hpp>
#include <boost/lexical_cast.hpp>

using boost::asio::ip::tcp;

class client : public std::enable_shared_from_this<client> {

    public:
        client(tcp::socket socket) : socket_(std::move(socket)) {

        }

        void start() {
        }

        tcp::socket socket_;

};

#endif
#ifndef PENGUIN_HPP
#define PENGUIN_HPP

#include "Client.hpp"

class penguin : public client {

    public:
        penguin() : client(socket_) {

        }

};

#endif
这就是我初始化企鹅类的方式

std::make_shared<penguin>(std::move(socket_))->start();
std::make_shared(std::move(socket_))->start();
socket\这里是服务器的tcp::socket内容


我是C++ NoOB,所以<强>任何帮助将非常感谢! 首先,让我们澄清一下。C++中,构造函数<强>没有继承< <强> >。类层次结构中构造函数的行为有时会让人觉得构造函数是继承的,有些人会认为我过于迂腐,但我认为理解这种区别很重要

现在的问题是如何在派生类的构造函数中调用基类的构造函数。答案在派生类的构造函数初始化列表中——正如您所做的那样

然而,你实际上是怎么做的有一个问题

penguin() : client(socket_) {}
这里,
socket\uu
是基类
client
的成员(除非您的帖子中有输入错误)<代码>套接字在
客户端
对象被实例化之前被引用,因此它甚至还不存在。这是一个鸡蛋问题。为了实例化
客户端
,您需要
套接字
,但是为了引用
套接字
,您需要实例化
客户端
,节拍还在继续


我没有一个简洁的建议可以给你解决这个问题,因为不幸的是没有简单的解决方法。这里真正的问题是你的设计被破坏了。由于在基类和该基类的成员之间引入了循环依赖关系,所以它被破坏。您需要重新审视您的设计。

首先,让我们澄清一下。C++中,构造函数<强>没有继承< <强> >。类层次结构中构造函数的行为有时会让人觉得构造函数是继承的,有些人会认为我过于迂腐,但我认为理解这种区别很重要

现在的问题是如何在派生类的构造函数中调用基类的构造函数。答案在派生类的构造函数初始化列表中——正如您所做的那样

然而,你实际上是怎么做的有一个问题

penguin() : client(socket_) {}
这里,
socket\uu
是基类
client
的成员(除非您的帖子中有输入错误)<代码>套接字在
客户端
对象被实例化之前被引用,因此它甚至还不存在。这是一个鸡蛋问题。为了实例化
客户端
,您需要
套接字
,但是为了引用
套接字
,您需要实例化
客户端
,节拍还在继续


我没有一个简洁的建议可以给你解决这个问题,因为不幸的是没有简单的解决方法。这里真正的问题是你的设计被破坏了。由于在基类和该基类的成员之间引入了循环依赖关系,所以它被破坏。您需要重新审视您的设计。

首先,让我们澄清一下。C++中,构造函数<强>没有继承< <强> >。类层次结构中构造函数的行为有时会让人觉得构造函数是继承的,有些人会认为我过于迂腐,但我认为理解这种区别很重要

现在的问题是如何在派生类的构造函数中调用基类的构造函数。答案在派生类的构造函数初始化列表中——正如您所做的那样

然而,你实际上是怎么做的有一个问题

penguin() : client(socket_) {}
这里,
socket\uu
是基类
client
的成员(除非您的帖子中有输入错误)<代码>套接字在
客户端
对象被实例化之前被引用,因此它甚至还不存在。这是一个鸡蛋问题。为了实例化
客户端
,您需要
套接字
,但是为了引用
套接字
,您需要实例化
客户端
,节拍还在继续


我没有一个简洁的建议可以给你解决这个问题,因为不幸的是没有简单的解决方法。这里真正的问题是你的设计被破坏了。由于在基类和该基类的成员之间引入了循环依赖关系,所以它被破坏。您需要重新审视您的设计。

首先,让我们澄清一下。C++中,构造函数<强>没有继承< <强> >。类层次结构中构造函数的行为有时会让人觉得构造函数是继承的,有些人会认为我过于迂腐,但我认为理解这种区别很重要

现在的问题是如何在派生类的构造函数中调用基类的构造函数。答案在派生类的构造函数初始化列表中——正如您所做的那样

然而,你实际上是怎么做的有一个问题

penguin() : client(socket_) {}
这里,
socket\uu
是基类
client
的成员(除非您的帖子中有输入错误)<代码>套接字在
客户端
对象被实例化之前被引用,因此它甚至还不存在。这是一个鸡蛋问题。为了实例化
客户端
,您需要
套接字
,但是为了引用
套接字
,您需要实例化
客户端
,节拍还在继续

我没有简明扼要的建议