C ++从不同的cpp

时间:2015-12-18 23:16:42

标签: c++

这可能已经被问过,但可能以不同的方式。 我搜索了很久但我找不到答案。我花了将近一整天的时间来解决这个小问题,所以我非常沮丧,不能再思考......

无论如何,我在访问动态结构时遇到问题。尝试了许多不同的方法但没有用。这是一个小例子: 假设我们有5个文件。一个main,调用function.cpp中的函数。 这是 function.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;
}

function.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),然后将字符串中第20个struct的内部放入“test”值。在fc_b中我试图访问第20个位置并输入值“test”。

问题是,这只是崩溃程序(如果输入是30,在较低的值它会做一些奇怪的东西),我不再有修复的想法。我只想从任何cpp文件访问此结构,将值保存在其中,并将它们用于以后的工作。最麻烦的事实是它是动态的,所以当我尝试以不同的方式修复它时,编译器大多数不接受任何没有[]或者只是抱怨“没有引用”错误等。  有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

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

如果此对象未在某处定义为全局变量,则会出现链接器错误。

如果您已将此类对象定义为全局变量,则不会出现链接错误,一切正常。但是,在你的函数中,只要你写:

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

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

当你学习时,第一个解决方案可以帮助你。在你养成坏习惯之前,应该避免这样做。

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

第二种可能性是使用vector<struct1>更进一步。然后,您可以按值或按引用传递向量,但您可以避免必须关心内存分配。