- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
它在 s_r->info
上崩溃,因为 s_r
没有指向 obj2
。函数 search_recurs()
应该找到指针并返回结果。它应该找到正确的指针,因为结果指向 obj2
。
但返回结果时会发生一些事情,因为 s_r
(其中 s_r=search_recurs()
返回结果)没有指向与结果相同的对象,这应该是从搜索中返回。
输出:
W Funkcji search:
Name: zmiana2d
Parameter_a : 5
Parameter_d : 6
adres rzutowanie: 00AFFC50
adres result: 00AFFC50
main:
adres obj2: 00AFFC50
adres s_r: 00AFFB04 //<======= Why is it not 00AFFC50 ?
代码:
#include "stdafx.h"
using namespace std;
class Node {
private:
public:
string name;
Node *parent;
vector <Node*> children;
Node() { name = "noname", parent = NULL; }
Node(string _name) { name = _name, parent = NULL; }
Node(Node *_parent) { parent = _parent; }
Node(string _name, Node *_parent) { name = _name, parent = _parent; }
Node(Node *_parent, vector <Node*> _children) { parent = _parent, children = _children; }
Node(string _name, Node *_parent, vector <Node*> _children) { name = _name, parent = _parent, children = _children; }
virtual ~Node() { cout << "Base Destructor called\n"; }
void add_parent(Node *wsk) {
parent = wsk;
}
void add_children(Node *child) {
children.push_back(child);
}
void info_node() {
cout << "Name: " << name << endl;
cout << "Address: " << this << endl;
cout << "Parent: " << parent << endl;
}
};
class A {
private:
string name;
int parameter_a;
protected:
A() { name = "untitled"; parameter_a = 1; }
A(string _name) { name = _name, parameter_a = 1; }
A(string _name, int _parameter_a) : name(_name), parameter_a(_parameter_a) {};
string info_name() {
return name;
}
int info_parameter_a()
{
return parameter_a;
}
public:
char info_type() {
return 'A';
}
friend class Leaf;
friend A* search_recurs_node(Node* root, string name);
virtual void info() = 0;
};
class Leaf : public Node {
private:
public:
vector<A*> objects;
Leaf() { name = "noname", parent = NULL; }
Leaf(string _name) { name = _name, parent = NULL; }
Leaf(Node *_parent) { parent = _parent; }
Leaf(string _name, Node *_parent) { name = _name, parent = _parent; }
Leaf(Node *_parent, vector <Node*> _children) { parent = _parent, children = _children; }
Leaf(string _name, Node *_parent, vector <Node*> _children) { name = _name, parent = _parent, children = _children; }
void add_objects_leaf(A* obj) {
objects.push_back(obj);
}
};
class X : public A, public Leaf {
private:
int parameter_x;
public:
X() : A("dziedziczone_w_X_z_A", 98), parameter_x(99) {};
X(string _name_x, int _parameter_a, int _parameter_x) : A(_name_x, _parameter_a), parameter_x(_parameter_x) {};
char info_type() {
return 'X';
}
void info() {
cout << "Name: " << A::info_name() << endl;
cout << "Parameter_a : " << A::info_parameter_a() << endl;
cout << "Parameter_d : " << parameter_x << endl;
}
};
A* search_recurs_node(Node* root, string name) {
A* result;
Leaf* rzutowanie;
if ((root->children.size()) > 0) {
for (int i = 0; i < (root->children.size()); ++i) {
search_recurs_node(root->children[i], name);
}
}
else if (rzutowanie = dynamic_cast<Leaf*>(root)) {
for (int i = 0; i < rzutowanie->objects.size();++i) {
if (rzutowanie->objects[i]->info_name() == name) {
cout << "W Funkcji search: " << endl;
rzutowanie->objects[i]->info();
cout << endl << "adres rzutowanie: " << rzutowanie->objects[i] << endl;
result = (rzutowanie->objects[i]);
cout << "adres result: " << result << endl;
cout << endl;
return result;
}
}
}
//return NULL;
};
int main()
{
//
Node A_node("node_A");
Leaf X_node("node_X", &A_node);
A_node.add_children(&X_node);
X obj1("name d1", 1, 2), obj2("zmiana2d", 5, 6);
X_node.add_objects_leaf(&obj1);
X_node.add_objects_leaf(&obj2);
A* s_r;
s_r = search_recurs_node(&A_node, "zmiana2d");
cout << "main: " << endl;
cout << "adres obj2: " << &obj2 << endl;
cout << "adres s_r: " << s_r << endl;
s_r->info();
cout << endl << "The cause of 90% of programming errors sits in front of the screen" << endl;
return 0;
}
最佳答案
初步评论
obj2
是 X
类型,它继承自 A
和 Leaf
。
您返回一个指向 A
的指针。但是 A
子对象是用 Leaf
嵌入到 X
中的;这就是为什么您可以获得另一个地址的原因。您应该将其转换为 X*
以确保具有完全相同的地址 whatever the layout of your class :
X* x_r = dynamic_cast<X*>(s_r); // you can, because there's a virtual fct
if (x_r)
cout << "adres x_r: "<<x_r<<endl;
else cout << "couldn't cast"<<endl;
顺便说一句,想为任何具有虚函数的类添加一个虚析构函数。
问题的根本原因
你的递归搜索函数不起作用:你递归地调用它,但你没有对结果做任何事情。修改如下:
...
if ((root->children.size()) > 0) {
for (int i = 0; i < (root->children.size()); ++i) {
auto a= search_recurs_node(root->children[i], name); // <== keep response returned
if (a) // <== if value already found
return a; // <== return it
}
}
...
在你的函数结束时返回 nullptr
是明智的(你为什么要注释掉它?)
关于c++ - 从函数 C++ 正确传递指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40344409/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!