C++从不同的cpp访问动态结构

C++ Accessing dynamic struct from different cpp

本文关键字:访问 动态 结构 cpp C++      更新时间:2023-10-16

这可能已经被问过了,但可能是以不同的方式。我找了很久,但就是找不到答案。我花了将近一整天的时间试图解决这个小问题,所以我很沮丧,再也无法思考了。。。

无论如何,我在访问动态结构时遇到了问题。尝试了许多不同的方法,但都无济于事。下面是一个小例子:假设我们有5个文件。一个main,其中调用function.cpp中的函数。这里是函数.cpp:

#include "struct.h"
#include <iostream>
void fc_a()
{
int a = 0;
std::cin >> a; //let's say 30
struct1* struct_test = new struct1[a];
struct_test[20].str = "Test";
std::cout << struct_test[20].str << std::endl;
}
void fc_b()
{
struct1 *struct_test; // just experimental, thought it would load the values
int b = 20; // dynamic as well, this is just for test
std::cout << struct_test[b].str << std::endl;
}

函数.h具有main调用所需的内容然后是我们的结构(例如struct.h

 #ifndef STRUCT_H_INCLUDED
 #define STRUCT_H_INCLUDED
  #include <string>
  struct struct1
  {
      std::string str;
      int a;
      int b;
  };
  #endif // STRUCT_H_INCLUDED

(然后将转到struct.cpp

#include "struct.h"
extern struct1 struct_test; //also tried with pointer

(因此,在本例中,我调用fc_a以动态方式将结构扩展到cin大小(例如30),然后将"test"值放入字符串中结构的第20个索引中。在fc_b中,我试图访问第20个位置并定制值"test"。

问题是,这只是破坏了程序(如果imput是30,在较低的值上,它会做一些奇怪的事情),我再也没有修复的想法了。我只想从任何cpp文件访问这个结构,保存其中的值,并在以后的工作中使用它们。最麻烦的是它是动态的,所以当我试图用不同的方式修复它时,编译器大多不会接受没有[]的东西,或者只会抱怨"没有引用"错误等。有什么想法吗?

具有相同名称的全局变量和局部变量之间的差异

您已经在struct.h中定义了类/结构struct1。当您声明extern struct1 struct_test时,您告诉编译器您已经在其他地方将类型为struct1的对象sruct_test定义为全局变量。

如果这个对象没有在某个地方定义为全局变量,则会出现链接器错误。

如果您已经将这样一个对象定义为全局变量,那么就不会出现链接错误,而且一切都很好。然而,在您的函数中,每当您写入:

struct1* struct_test = new struct1[a];  

您创建了一个本地对象,也称为struct_test,但它完全独立于其他地方定义的全局对象。它甚至有一个不同的类型(这里是一个指针)。函数一返回,此本地对象就会被销毁,其内容也会丢失。所以在这里,你会泄露内存。

如果全局变量也是指针,则存在单元化指针的风险

现在,如果你也将全局变量定义为指针,情况可能会变得更糟:

struct1* struct_test;     // somewhere out of any function

该全局变量将自动初始化为nullptr。现在在您的函数中,您可能会有这样的印象:您初始化了全局变量,而实际上您正在初始化局部变量。稍后在另一个函数中,您可以访问struct_test的元素。由于全局变量仍然是nullptr,您将获得未定义的行为(例如:内存损坏、分段错误、冻结、各种奇怪的行为,甚至事情可能看起来很正常)。

第一个(非常基本的)解决方案

// function.cpp
#include "struct.h"
...
extern struct1* struct_test;   // tell that it's defined somewhere else
void fc_a()
{
    int a = 0;
    std::cin >> a; //let's say 30
    struct_test = new struct1[a];  // refer to the global variable without redefining it
    if (a>20) {
        struct_test[20].str = "Test";
        std::cout << struct_test[20].str << std::endl;
    } 
    else std::cout << "Ooops ! Just avoided a bad subscript !!" <<std::endl; 
}
// other.cpp
#include <struct.h>
struct1* struct_test;   // no extern:  it's really defined here

避免全局变量&进一步的步骤

当你开始学习时,第一个解决方案会有所帮助。在你养成坏习惯之前,应该避免它。

一种可能性是,从分配指针的函数返回指针,然后将此指针作为参数传递给需要它的函数

第二种可能性是进一步使用CCD_ 9。然后可以通过值或引用传递向量,但不必关心内存分配。