C++ c++;远期申报+;ifndef还需要指针 数组:
在这种情况下,您无法避免转发声明和指针C++ c++;远期申报+;ifndef还需要指针 数组:,c++,forward-declaration,ifndef,C++,Forward Declaration,Ifndef,在这种情况下,您无法避免转发声明和指针 类对象有一个映射成员,类数组有一个向量成员。这意味着Value必须在编译Object和Array时是一个完全定义的完整类型,因为map和vector需要知道其元素类型的总大小。如果Value具有非指针Array和Object成员,则Object和Array将需要Value作为完整类型,但Value将需要Object和Array作为完整类型。第二十二条军规 因此,您必须对值成员使用前向声明和指针/引用,以使这种循环引用正常工作,因为不完整类型的指针/引用是允
类对象
有一个映射
成员,类数组
有一个向量
成员。这意味着Value
必须在编译Object
和Array
时是一个完全定义的完整类型,因为map
和vector
需要知道其元素类型的总大小。如果Value
具有非指针Array
和Object
成员,则Object
和Array
将需要Value
作为完整类型,但Value
将需要Object
和Array
作为完整类型。第二十二条军规
因此,您必须对值成员使用前向声明和指针/引用,以使这种循环引用正常工作,因为不完整类型的指针/引用是允许的
更新:在接受对象*
参数的值
构造函数中,将\u对象
成员设置为指向超出范围的本地对象
实例,该实例在构造函数退出时被销毁,从而使\u对象
悬空。这就是为什么随后的val.\u对象->\u成员.size()
表达式在main()
中产生垃圾(幸运的是代码没有完全崩溃)val.\u对象
指向无效内存,因此其成员
不是有效的映射
对象,因此读取其size()
是未定义的行为。这可以追溯到我发布的原始评论:
您可能正在访问无效指针
要解决此问题,根据实际设计目标,值
构造函数需要:
- 动态构造一个新的
对象
,以后必须将其删除。您还必须提供适当的复制构造函数和复制赋值运算符:
Value::Value()
{
_object=NULL;
_数组=空;
}
值::值(对象*\u对象)
{
_对象=新对象;
_数组=空;
if(_对象)
_对象。_成员=u对象->_成员;
}
值::值(常量值和值)
{
_对象=新对象;
_数组=空;
如果(_值._对象)
_对象。_成员=_值。_对象->成员;
}
值::~Value()
{
删除对象;
}
值和值::运算符=(常量值和值)
{
如果(&_值!=此)
{
值tmp(uu值);
std::swap(_对象,tmp._对象);
std::swap(_数组,tmp._数组);
}
归还*这个;
}
- 只需存储给定的
对象*
指针:
Value::Value(对象*\uu对象)
{
_对象=_对象;
_数组=空;
}
重要阅读:和。特别是在一起使用和在标题中使用时,这是一种很好的方法,可以创建非常讨厌的bug并将编译时间增加一个数量级即使在所谓的“竞争性编程”中,代码>也是不可接受的。人们从一开始就选择坏习惯,然后坚持下去。你到底在问什么?我不能理解你的想法。你试过指针,但没有成功,你不知道你是否应该坚持。。。但是这和你粘贴在这里的代码有什么关系呢?您需要帮助的实际问题是什么?@MaifeeUIAsad“在使用指针时,我遇到了许多问题,例如,我的映射中只有一个键值对,但在下一行中,大小变得非常大,不知从何而来。”-然后,您在代码之外犯了其他错误。但我们看不出那是什么。请提供一份报告。您可能正在访问一个无效指针。@remy刚刚添加了两个构造函数,map作为参数,object作为参数。。。代码在主函数中。有什么方法可以在所有标题中定义这些对象的形状。。。我只是想避免指针…“我只是想避免指针”-为什么?如果你不喜欢使用指针,那么你根本不应该使用C++。指针是C++语言的核心和重要组成部分。第一行写的是我给它的尺寸,下一行只是一个随机数。。。地图充满了垃圾值…@MaifeeUlAsad请不要在其他网站上发布代码,而是将相关代码放在那里。因此,问题应该是独立的,外部联系会随着时间的推移而中断。在任何情况下,Object Object=Object(members)
和Value val=Value(&Object)
都不会编译,因为Object
和Value
到目前为止所显示的代码中没有这样的构造函数。@maifeeula如果您没有正确地遵循规则,就会发生糟糕的事情。
#ifndef ARRAY_H
#define ARRAY_H
#include <bits/stdc++.h>
using namespace std;
namespace Maifee{
class Value;
class Array {
public:
Array();
vector<Value> _elements;
};
}
#endif // ARRAY_H
#ifndef OBJECT_H
#define OBJECT_H
#include <bits/stdc++.h>
#include "value.h"
using namespace std;
namespace Maifee{
class Value;
class Object{
public:
Object();
map<string, Value> _members;
};
}
#endif // OBJECT_H
#ifndef VALUE_H
#define VALUE_H
#include <bits/stdc++.h>
#include "array.h"
#include "object.h"
using namespace std;
namespace Maifee{
class Array;
class Object;
class Value {
public:
Value();
Value(Object *__object);
Array *_array;
Object *_object;
};
}
#endif // VALUE_H
Object object=Object();
cout << "pop obj tem len" << object._members.size() << endl; //gives 0 as expected
object._members = members;
cout << "pop obj tem len" << object._members.size() << endl; //gives the expected number
Value val=Value(&object);
cout << val._object->_members.size() << "size here" << endl; //gives a random number
Value::Value(Object *__object)
{
Object object;
object._members.insert(__object->_members.begin(), __object->_members.end());
_object = &object;
}