我有以下的类定义:
class A {...}
class B : public class A {...}
以及所有者类定义:
class C {
A* a;
public:
C (A* a) { this->a = a; }
}
然后,当我试图调用以下内容时,一切都很好:
B* b = new B();
C(b);
但是,我有以下所有者类定义:
class C {
std::unique_ptr<A> a;
public:
C(std::unique_ptr<A>& a) { this->a = std::mo
我想把一个long long数组传递给一个目标c函数。如果可能的话,我希望将数组作为指针传递,这样就不会进行复制。我写了这段代码:
+ (int) getIndexOfLongLongValue: (long long) value inArray: (long long []) array size: (int) count
{
for (int i =0; i < count; i++)
{
if (array[i] == value)
return i + 1;
}
return 0;
}
我把它传给
long l
以下情况:
class Main{
void MainMethod(){
C * c;
B * b = new B();
b->fillC(c);
}
};
class B{
void fillC(C* c){
c = new C();
}
};
class C{
};
在我的软件中,我遇到了这种情况。在程序的末尾,类Main的c仍然是空的。为什么会这样呢?
我的代码出现了_CrtIsValidHeapPointer错误。我终于知道是什么引起了麻烦。
我用下面的例子来说明这一点:
char* c=(char*)malloc(20*sizeof(char));
//cout<<&c<<endl;
c="hello world";
//cout<<&c<<endl; //if you uncomment the 2 clauses,you'll see the address is the same
这实际上是一个普遍的问题,但现在我正在使用Go和C#。假设我们希望在Go中从用户的输入中赋值一个变量:
func main() {
var input float64
fmt.Scan(&input)
}
很明显,为什么我们需要一个内存位置来放置我们的新值。但是,为什么在像Java或C#这样的语言中,我们没有遵循相同的逻辑:
var input = Convert.ToInt32(Console.ReadLine());
// and not &input ...
在C++中,常见的情况如下:
C类报头
//== C.h ==//
#pragma once
#include "B.h"
class C
{
B b;
};
B类报头
//== B.h ==//
#pragma once
#include "A.h"
class B
{
A a;
};
A类的标题
//== A.h ==//
#pragma once
class A
{
};
因为C.h包含B.h,B.h包含A.h;C.h最终知道了A.h的实现细节。在这种情况下,头只包含三个层次,但在大型项目中,包括一个标头,会很快导致包含数百个额外的