如何从实现接口的模板化类实例访问结构
How to acess structure from an instance of templated class implementing an interface
根据我的以下代码,我基本上有 2 个问题:
#include <iostream>
#include <memory>
class Interface
{
public:
virtual ~Interface() = default;
virtual int GetOperation() const = 0;
};
template <typename T>
class Util : public Interface
{
public:
Util ();
virtual ~Util (){}
virtual int GetOperation() const override;
T GetFields() ;
private:
int index;
int operation;
T mfield;
};
class A
{
public:
A(){}
int noOfPkts;
};
template <class T>
Util<T>::Util()
{
}
template <class T>
int Util<T>::GetOperation() const
{
return operation;
}
template <class T>
T Util<T>::GetFields()
{
return mfield;
}
int main()
{
auto sn = std::make_unique <Util<A>>();
//sn->GetFields().noOfPkts = 10;
}
如果我取消注释代码,则会出现编译错误:
$ c++ -std=c++14 try51.cpp
try51.cpp: In function 'int main()':
try51.cpp:51:26: error: using temporary as lvalue [-fpermissive]
sn->GetFields().noOfPkts = 10;
其次,我实际上想在接口中实现一个方法,该方法将返回模板类字段结构,如下所示:
#include <iostream>
#include <memory>
class Interface
{
public:
virtual ~Interface() = default;
virtual int GetOperation() const = 0;
virtual struct Fields* GetFields() const = 0;
};
template <typename T>
class Util : public Interface
{
public:
Util ();
virtual ~Util (){}
virtual int GetOperation() const override;
virtual struct Fields* GetFields() const override;
private:
int index;
int operation;
T mfield;
};
class A
{
public:
A(){}
struct Fields {
int noOfPkts;
} f;
};
template <class T>
Util<T>::Util()
{
}
template <class T>
int Util<T>::GetOperation() const
{
return operation;
}
template <class T>
struct Fields* Util<T>::GetFields() const
{
return &mfield.f;
}
int main()
{
auto sn = std::make_unique <Util<A>>();
//sn->GetFields().noOfPkts = 10;
}
但是我得到以下编译错误 -
$ c++ -std=c++14 try51.cpp
try51.cpp: In instantiation of 'Fields* Util<T>::GetFields() const [with T = A]':
try51.cpp:55:1: required from here
try51.cpp:47:17: error: cannot convert 'const A::Fields*' to 'Fields*' in return
return &mfield.f;
如何解决这两个问题?
建议不要在同一帖子中提出多个问题。
这使得给你一个简洁的答案变得更加困难。
对于您的第一个问题:
T GetFields()
的返回是内部成员mfield
的临时副本。
编译器会提醒您您正在尝试编辑临时值。
为了使此操作按编码方式工作,您需要将T GetFields()
的签名更新为T& GetFields()
,以使其返回对内部字段的引用,而不是副本。
对于你的第二个问题:
你不能那样做多态性。界面不知道Fields
是什么。将字段结构从 A 中拉出,以便所有内容都可以正确查看它,和/或使其成为模板参数的一部分。
更新:在评论中讨论内容时,您似乎正在尝试从内到外构建数据结构,而这不会编译。
在此特定情况下,类A
中指定的数据结构具有 TypeA::Fields
,但Interface
指定Interface::GetFields()
返回类型Fields
的对象A::Fields
不是的对象的地址。
为了使您当前的配置正常工作,您需要使A::Fields
成为从Fields
派生的类,如果您有另一个定义特定Fields
结构的类B
,则需要任何调用Interface::GetFields()
的函数来执行运行时类型自检(RTTI(,使用dynamic_cast
或typeid
来确定它在访问其成员之前是否有A::Fields
或B::Fields
, 从而避免读取数据结构内存之外并触发分段错误。
相关文章:
- 初始化指向类实例的智能指针并访问其方法
- 如何从实现接口的模板化类实例访问结构
- 访问同级类实例的成员
- 从模板参数包实例化的访问类实现
- 如何使用包含内部类的类实例有效地从内部类访问成员?
- 限制多模板参数朋友函数可访问的类实例的范围
- 从 QT Widget 对象实例访问 QT Widget 子成员
- 为什么 clang 不允许通过实例访问嵌套枚举类?
- 从C++中的父类实例访问子类方法
- 我可以从 C++ 中的派生实例访问指向基本实例的指针吗?
- c++单例类实例访问整个应用程序
- 为什么我无法从基类的实例访问受保护的成员?
- 为什么可以从派生实例访问基类中的受保护变量
- 尝试从从 DLL 加载的驱动类实例访问基类向量成员时,程序崩溃
- 通过外部类的实例访问嵌套的内部类
- 通过对象实例访问私有静态成员
- 如何在c++中从一个实例访问另一个实例的信息
- 任何实例访问(类的)所有实例
- 从子类实例访问和更改父值
- 在c++中,通过指针或实例访问类/结构的优点是什么?