如何在运行时使用构造函数初始化类中私有的数组?

什么东西

当我在名为visited的类中在私有访问中创建一个指针时,我创建了一个类Graph。在构造函数中,我在所有地方都将数组初始化为零,但是当我在另一种方法中检查所有值是否为零时,它在数组中显示垃圾值,但是当我在构造函数本身中打印它时,它显示全为零.

#include<iostream>
#include<vector>
#include<list>
using namespace std;

class Graph {
private:
  int vertices,edges;
  vector <list<int>> graph;
  vector <int> vs;
  int *visited;
public:
  Graph (int vertices)
  {
    this->vertices = vertices;
    list <int>l;
    for (size_t i = 0; i < vertices; i++) {
      graph.push_back(l);
      vs.push_back(i);
    }
    edges=0;
// #######  made a new array, initialized all values with zeroes and assigned it to the instance variable visited  #########
    int a[vertices]={0};
    this->visited = a;
// ########  in the constructor it is showing correct values below  #######
    for (size_t i = 0; i < vertices; i++) {
      std::cout << this->visited[i] << ' ';
    }
    std::cout << '\n';
  }
  virtual ~Graph ()
  {

  }
  void showList()
  {
// just printing the graph in the form of adjacency list 
// it is working fine
    for (size_t i = 0; i < vertices; i++)
    {
      list <int>::iterator p = graph[i].begin();
      std::cout << i ;
      for (; p != graph[i].end() ; p++)
      {
        std::cout << " -> " << *p ;
      }
      std::cout << " -> NULL" << '\n';
    }
// ########  when I am checking the values here then it is printing garbage values 
    for (size_t i = 0; i < this->vertices; i++) {
      std::cout << this->visited[i] << ' ';
    }
  }
  void addEdge(int source, int destination)
  {
    graph[source].push_back(destination);
  }
};

int main()
{
  Graph g(6);
  g.addEdge(0,1);
  g.addEdge(0,2);
  g.addEdge(1,0);
  g.addEdge(1,3);
  g.addEdge(1,4);
  g.addEdge(2,0);
  g.addEdge(2,4);
  g.showList();
  return 0;
}

当我调用 showList 方法时,它应该打印相邻列表和所有零(名为visited 的数组的内容)

马丁·约克

我做了一个类图。

是的,你有。

class Graph {

我在名为visited 的类中创建了一个私有访问指针。

是的,你有。

private:
  int *visited;

在构造函数中,我在所有地方都用零初始化了数组。

是的,你有。

int a[vertices]={0};

但我会注意到这是一个局部于构造函数的变量。它对任何其他方法都是不可见的。同样,当构造函数完成此对象的生命周期时。任何在其生命周期结束后访问该数组的尝试都是未定义行为。因此,通过某种偷偷摸摸的机制(例如将其地址保存在指针中)访问它会导致不好的事情发生。

在这里,您正在做一些偷偷摸摸的事情(而且非常糟糕):

this->visited = a;

但是当我在另一种方法中检查所有值是否为零时

您正在通过指针访问数组visited这指向一个不再存在的数组,因为该数组是另一个函数的本地数组。

    std::cout << this->visited[i] << ' ';  // This is broken code.

它显示数组中的垃圾值

你太倒霉了。如果程序崩溃并且让坏事正在发生变得更加明显,那就更好了。不幸的是,您发现未定义的行为可以做任何事情(包括简单地返回一些随机值)。

但是当我在构造函数中打印它时,它显示全零。

它在构造函数中仍然有效,因此访问它不是问题。

那么有什么解决办法。

一般来说,你应该避免使用指针(尤其是全新的)。您需要先了解一些基本概念。

在这种情况下,只需替换:

 int*   visited;

 std::vector<int> visited;

在构造函数中用适当的零值填充它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在C ++中使用构造函数(只是构造函数)在类中初始化大型私有数组?

来自分类Dev

如何在运行时Objective-C中重写/处理私有类的方法?

来自分类Dev

在运行时初始化数组元素

来自分类Dev

如何在不使用常量数组大小的情况下初始化私有类中的数组?

来自分类Dev

在运行时使用默认构造函数实例化类型参数化的类

来自分类Dev

如何在运行时初始化Peewee SQLite数据库?

来自分类Dev

如何在运行时不使用@PostContruct的情况下使用数据库中的值初始化inputtextfield?

来自分类Dev

如何在运行时根据构造函数参数在超类中创建子类对象(在Java中)

来自分类Dev

如何在默认构造函数中初始化数组?

来自分类Dev

没有操作符=,复制构造函数或默认构造函数和运行时参数的对象的数组初始化

来自分类Dev

如何在类构造函数中初始化动态分配的数组

来自分类Dev

在Scala宏中,如何获取类在运行时具有的全名?

来自分类Dev

在具有私有构造函数的类中初始化静态变量

来自分类Dev

继承和复制构造函数-如何从基类初始化私有字段?

来自分类Dev

如何从子类的构造函数初始化父类的私有成员

来自分类Dev

使用私有构造函数进行静态初始化

来自分类Dev

类内成员初始化是在编译时还是在运行时进行?

来自分类Dev

如何在运行时在Scala中检查我是否在@specialized函数或类中?

来自分类Dev

在运行时初始化依赖项

来自分类Dev

在运行时初始化unique_ptr

来自分类Dev

在运行时初始化依赖项

来自分类Dev

在构造函数中初始化数组类变量

来自分类Dev

如何在运行时在Clojure中序列化函数?

来自分类Dev

Java-如何允许类的所有方法访问在构造函数中初始化的数组?

来自分类Dev

从类继承私有的初始化?

来自分类Dev

如何在运行时在现有类中创建方法?

来自分类Dev

如何在运行时使用类型定义具有内部类的类?

来自分类Dev

在没有构造函数的类中初始化变量

来自分类Dev

如何在没有复制构造函数的情况下初始化类的静态实例

Related 相关文章

  1. 1

    如何在C ++中使用构造函数(只是构造函数)在类中初始化大型私有数组?

  2. 2

    如何在运行时Objective-C中重写/处理私有类的方法?

  3. 3

    在运行时初始化数组元素

  4. 4

    如何在不使用常量数组大小的情况下初始化私有类中的数组?

  5. 5

    在运行时使用默认构造函数实例化类型参数化的类

  6. 6

    如何在运行时初始化Peewee SQLite数据库?

  7. 7

    如何在运行时不使用@PostContruct的情况下使用数据库中的值初始化inputtextfield?

  8. 8

    如何在运行时根据构造函数参数在超类中创建子类对象(在Java中)

  9. 9

    如何在默认构造函数中初始化数组?

  10. 10

    没有操作符=,复制构造函数或默认构造函数和运行时参数的对象的数组初始化

  11. 11

    如何在类构造函数中初始化动态分配的数组

  12. 12

    在Scala宏中,如何获取类在运行时具有的全名?

  13. 13

    在具有私有构造函数的类中初始化静态变量

  14. 14

    继承和复制构造函数-如何从基类初始化私有字段?

  15. 15

    如何从子类的构造函数初始化父类的私有成员

  16. 16

    使用私有构造函数进行静态初始化

  17. 17

    类内成员初始化是在编译时还是在运行时进行?

  18. 18

    如何在运行时在Scala中检查我是否在@specialized函数或类中?

  19. 19

    在运行时初始化依赖项

  20. 20

    在运行时初始化unique_ptr

  21. 21

    在运行时初始化依赖项

  22. 22

    在构造函数中初始化数组类变量

  23. 23

    如何在运行时在Clojure中序列化函数?

  24. 24

    Java-如何允许类的所有方法访问在构造函数中初始化的数组?

  25. 25

    从类继承私有的初始化?

  26. 26

    如何在运行时在现有类中创建方法?

  27. 27

    如何在运行时使用类型定义具有内部类的类?

  28. 28

    在没有构造函数的类中初始化变量

  29. 29

    如何在没有复制构造函数的情况下初始化类的静态实例

热门标签

归档