模板 class 带有此指针的多重继承构造函数不起作用?
template class multiple inheritance constructor with this pointer doesn't work?
我有一个非常基本的代码,牢记 java。我做了一个对象和 Class class 但在模板中。
Object.hpp
#ifndef _OBJECT_HPP_
#define _OBJECT_HPP_
namespace library{
template<class T> class Object;
template<class T> class Class;
class Uint_32;
template<class T>
class Object{
public:
const static Uint_32& UNIQUEID;
private:
const Class<T>& myClass;
const static Class<T>& ref;
protected:
Object(Class<T>& myReference);
Object();
};
}
#endif
Object.cpp
#include "include//lang//template//Object.hpp"
#include "include//lang//template//Class.hpp"
#include "include//lang//Uint_32.hpp"
#include "iostream"
using namespace std;
using namespace library;
template<class T>const Uint_32& Object<T>::UNIQUEID=Uint_32(1);
template<class T>const Class<T>& Object<T>::ref=Class<T>();
template<class T>
Object<T>::Object(Class<T>& myReference):myClass(myReference){cout<<"
checking ";}
template<class T>
Object<T>::Object():myClass(ref){cout<<"ohk";}
Class.hpp
#ifndef _CLASS_HPP_
#define _CLASS_HPP_
#include"include//lang//Object.hpp"
namespace library{
template<class T>
class Class:public virtual Object<T>{
public:
Class();
const static Uint_32& UNIQUEID;
};
}
#endif
Class.cpp
#include "include//lang//template//Class.hpp"
#include "include//lang//Uint_32.hpp"
using namespace library;
template<class T>const Uint_32& Class<T>::UNIQUEID=Uint_32(2);
template<class T>
Class<T>::Class():Object(*this){
cout<<" hello ";
}
Uint_32.hpp
#ifndef _UINT_32_HPP_
#define _UINT_32_HPP_
#include "include//lang//Class.hpp"
#include "include//lang//Operators.hpp"
namespace library{
class Uint_32:public virtual Class<Uint_32>{
public:
Uint_32();
Uint_32(const int&&);
friend Uint_32& operator+(const Uint_32& a,const Uint_32& b);
friend Uint_32& operator<<(const Uint_32& a,const int& b);
const static Uint_32& UNIQUEID;
private:
int value;
};
}
#endif
Uint_32.cpp
#include "include//lang//Uint_32.hpp"
using namespace library;
const Uint_32& Uint_32::UNIQUEID=Uint_32(3);
Uint_32::Uint_32():Class<Uint_32>(){
value=0;
cout<<" here ";
}
Uint_32::Uint_32(const int&& val):Class<Uint_32>(){
value=val;
cout<<" there ";
}
t1.cpp
#include "include//lang//Uint_32.hpp"
using namespace library;
int main()
{
cout<<"\n";
Uint_32 a,b;
return 0;
}
编译命令:
g++ -std=c++14 -I. -c src//lang//Uint_32.cpp -o obj//lang//Uint_32.o
g++ -std=c++14 -I. src//test//t1.cpp obj//lang//Uint_32.o -o bin//test
总算暂时没有编译错误了。我还有一个带有 operators.hpp 的文件,其中只包含每个运算符的模板定义。
输出
当我 运行 可执行文件时,我得到以下输出,我可能不明白为什么?我想尽一切办法知道。我还 运行 在不同的系统上使用不同的版本。
ohk hello there checking hello
ohk hello here ohk hello here
这里发生了什么?为什么我的继承不能正确调用?我知道我不应该传递这个指针,因为它不安全,但我想我别无选择。
我的问题
Object<T>::Object(Class<T>& myReference)
只调用了一次,但应该调用三次。
- 在我看来有四个对象创建,它必须是 3 或 5(t1.cpp 中的 a 和 b 以及每个 class 中的 UNIQUEID 初始化。
- 为什么这在构造函数调用的 Class.cpp 文件中不起作用?
- 有什么方法可以检查我是否可以让 Object class 调用
Object<T>::Object()
构造函数,以便 T = Object class?
您正在使用虚拟继承。最派生的class负责初始化它所有的虚基classes.
写的时候
Uint_32::Uint_32(const int&& val):Class<Uint_32>(){ ... }
您似乎期望 Uint_32
构造函数调用 Class<Uint_32>()
构造函数,然后调用 Object(*this)
。但事实并非如此。由于 Object
是一个虚拟基 class,Uint_32
负责初始化它,而不是 Class
。由于 Uint_32
没有在其初始化列表中提及它,因此使用 Object
的默认构造函数(而不是单参数构造函数)。
对 Object(Class<T>&)
的一次调用来自 template<class T>const Class<T>& Object<T>::ref=Class<T>();
。这是您将 Class
实例化为最派生对象的唯一地方(与另一个对象的基础 class 子对象相反),这使得它负责调用 Object
构造函数,它Object(*this)
.
你怎么算四次?在您显示的输出中,单词 there
出现一次,单词 here
出现两次,总共构造了三个 Uint_32
实例。它们是 a
、b
和 Uint_32::UNIQUEID
。
我不确定我是否理解你的问题 4. 你是在问你是否可以写,比方说,
Object<Object<int>> obj;
?我不明白为什么不可以,但是您可以轻松地尝试一下并亲自看看。
我有一个非常基本的代码,牢记 java。我做了一个对象和 Class class 但在模板中。
Object.hpp
#ifndef _OBJECT_HPP_
#define _OBJECT_HPP_
namespace library{
template<class T> class Object;
template<class T> class Class;
class Uint_32;
template<class T>
class Object{
public:
const static Uint_32& UNIQUEID;
private:
const Class<T>& myClass;
const static Class<T>& ref;
protected:
Object(Class<T>& myReference);
Object();
};
}
#endif
Object.cpp
#include "include//lang//template//Object.hpp"
#include "include//lang//template//Class.hpp"
#include "include//lang//Uint_32.hpp"
#include "iostream"
using namespace std;
using namespace library;
template<class T>const Uint_32& Object<T>::UNIQUEID=Uint_32(1);
template<class T>const Class<T>& Object<T>::ref=Class<T>();
template<class T>
Object<T>::Object(Class<T>& myReference):myClass(myReference){cout<<"
checking ";}
template<class T>
Object<T>::Object():myClass(ref){cout<<"ohk";}
Class.hpp
#ifndef _CLASS_HPP_
#define _CLASS_HPP_
#include"include//lang//Object.hpp"
namespace library{
template<class T>
class Class:public virtual Object<T>{
public:
Class();
const static Uint_32& UNIQUEID;
};
}
#endif
Class.cpp
#include "include//lang//template//Class.hpp"
#include "include//lang//Uint_32.hpp"
using namespace library;
template<class T>const Uint_32& Class<T>::UNIQUEID=Uint_32(2);
template<class T>
Class<T>::Class():Object(*this){
cout<<" hello ";
}
Uint_32.hpp
#ifndef _UINT_32_HPP_
#define _UINT_32_HPP_
#include "include//lang//Class.hpp"
#include "include//lang//Operators.hpp"
namespace library{
class Uint_32:public virtual Class<Uint_32>{
public:
Uint_32();
Uint_32(const int&&);
friend Uint_32& operator+(const Uint_32& a,const Uint_32& b);
friend Uint_32& operator<<(const Uint_32& a,const int& b);
const static Uint_32& UNIQUEID;
private:
int value;
};
}
#endif
Uint_32.cpp
#include "include//lang//Uint_32.hpp"
using namespace library;
const Uint_32& Uint_32::UNIQUEID=Uint_32(3);
Uint_32::Uint_32():Class<Uint_32>(){
value=0;
cout<<" here ";
}
Uint_32::Uint_32(const int&& val):Class<Uint_32>(){
value=val;
cout<<" there ";
}
t1.cpp
#include "include//lang//Uint_32.hpp"
using namespace library;
int main()
{
cout<<"\n";
Uint_32 a,b;
return 0;
}
编译命令:
g++ -std=c++14 -I. -c src//lang//Uint_32.cpp -o obj//lang//Uint_32.o
g++ -std=c++14 -I. src//test//t1.cpp obj//lang//Uint_32.o -o bin//test
总算暂时没有编译错误了。我还有一个带有 operators.hpp 的文件,其中只包含每个运算符的模板定义。
输出 当我 运行 可执行文件时,我得到以下输出,我可能不明白为什么?我想尽一切办法知道。我还 运行 在不同的系统上使用不同的版本。
ohk hello there checking hello
ohk hello here ohk hello here
这里发生了什么?为什么我的继承不能正确调用?我知道我不应该传递这个指针,因为它不安全,但我想我别无选择。
我的问题
Object<T>::Object(Class<T>& myReference)
只调用了一次,但应该调用三次。- 在我看来有四个对象创建,它必须是 3 或 5(t1.cpp 中的 a 和 b 以及每个 class 中的 UNIQUEID 初始化。
- 为什么这在构造函数调用的 Class.cpp 文件中不起作用?
- 有什么方法可以检查我是否可以让 Object class 调用
Object<T>::Object()
构造函数,以便 T = Object class?
您正在使用虚拟继承。最派生的class负责初始化它所有的虚基classes.
写的时候
Uint_32::Uint_32(const int&& val):Class<Uint_32>(){ ... }
您似乎期望 Uint_32
构造函数调用 Class<Uint_32>()
构造函数,然后调用 Object(*this)
。但事实并非如此。由于 Object
是一个虚拟基 class,Uint_32
负责初始化它,而不是 Class
。由于 Uint_32
没有在其初始化列表中提及它,因此使用 Object
的默认构造函数(而不是单参数构造函数)。
对 Object(Class<T>&)
的一次调用来自 template<class T>const Class<T>& Object<T>::ref=Class<T>();
。这是您将 Class
实例化为最派生对象的唯一地方(与另一个对象的基础 class 子对象相反),这使得它负责调用 Object
构造函数,它Object(*this)
.
你怎么算四次?在您显示的输出中,单词 there
出现一次,单词 here
出现两次,总共构造了三个 Uint_32
实例。它们是 a
、b
和 Uint_32::UNIQUEID
。
我不确定我是否理解你的问题 4. 你是在问你是否可以写,比方说,
Object<Object<int>> obj;
?我不明白为什么不可以,但是您可以轻松地尝试一下并亲自看看。