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;
}