我一直在开发一个控制台应用程序,直到我们的项目需要一个花哨的UI来使用它,所以我们决定将项目类型更改为Windows窗体应用程序.我们尝试将以下代码放在我们的入口点:
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new UI());
Run Code Online (Sandbox Code Playgroud)
它有点工作,但原来的控制台窗口仍然存在.
我已经搜索了一些像这样的有用的信息,但他们所做的一切基本上是在创建窗口后杀死窗口,而不是解决问题的根源.那么还有更优雅的方法吗?
假设我们有这个A类:
class A
{
public:
int a;
A(int b)
{
a = b;
}
};
Run Code Online (Sandbox Code Playgroud)
我想创建一个+重载,这样我就可以像这样使用它
A a(1),b(2),c(3),&d;
d = a + b + c;
Run Code Online (Sandbox Code Playgroud)
不修改每个对象的内容.下一个合乎逻辑的事情是每次分配一块新的内存,如下所示:
A &operator+ (const A &b)
{
A *c = new A(a+b.a);
return *c;
}
Run Code Online (Sandbox Code Playgroud)
但这会产生一个新问题:中间结果丢失,导致内存泄漏.我可以通过制作一个静态函数来轻松解决这个问题,该函数需要三个A对象引用并将前两个的总和存储在第三个中,但我愿意打赌必须有一些方法来使+重载发生的方式我想要.
所以问题是:有没有什么方法可以使用一系列操作符重载,它们不会在不引起内存泄漏的情况下修改操作数?
可能重复:
C++中指针变量和引用变量之间有什么区别?
例如,我有两个执行相同操作的函数:
int func(int &a)
{
return a+1;
}
Run Code Online (Sandbox Code Playgroud)
和
int func2(int *a)
{
return *a+1;
}
Run Code Online (Sandbox Code Playgroud)
在调用这些函数中的任何一个函数时,使用func over func2有什么好处?
我有两个问题困扰了我好几个小时.connected/2
应该判断两个人是否有联系; distance/3
应该衡量血缘关系.但:
true
寻求无限的查询connected(x,y)
;N
的distance(x,y,N)
查询无限增加.有什么建议?这是我的事实:
male(ted).
male(barney).
male(ranjit).
male(marshall).
male(tony).
male(swarley).
male(steve).
male(chuck).
male(john).
male(devon).
male(morgan).
female(robin).
female(lily).
female(wendy).
female(stellar).
female(abby).
female(victoria).
female(carina).
female(sarah).
female(ellie).
married(ted, robin).
married(marshall, lily).
married(ranjit, wendy).
married(stellar, tony).
married(steve, carina).
married(sarah, chuck).
married(ellie, devon).
father(ted, barney).
father(ted, ranjit).
father(marshall, wendy).
father(ranjit, stellar).
father(tony, abby).
father(tony, swarley).
father(tony, victoria).
father(steve, chuck).
father(steve, ellie).
father(chuck, john).
father(devon, morgan).
mother(robin, barney).
mother(robin, ranjit).
mother(lily, wendy).
mother(wendy, stellar). …
Run Code Online (Sandbox Code Playgroud) 很抱歉,如果之前已经询问过这个问题,但我想简单回答以下两种用法之间的差异.VS似乎接受它们作为有效代码.
private static void doSomeWork()
{
//do some work
}
public someClass()
{
//Thread thread = new Thread(doSomeWork);
//or
//Thread thread = new Thread(new ThreadStart(doSomeWork));
}
Run Code Online (Sandbox Code Playgroud) Visual Studio还可以,但我真的很讨厌你必须经历项目创建的所有过程才能编译一个源文件.Windows中是否有允许直接从目录编译的编译器?
我最近一直在阅读一些关于C++的Windows编程的书籍,而且我对WinAPI中的一些重复概念有一些令人困惑的理解.例如,有很多以handle关键字'H'开头的数据类型,它们应该像指针一样使用吗?但是还有其他数据类型以指针关键字"P"开头.所以我猜不是.那究竟是什么?为什么一些数据类型的指针首先给出了单独的数据类型?例如,PCHAR可以很容易地设计为CHAR*?
NetworkStream stream = socket.GetStream();
if (stream.CanRead)
{
while (true)
{
int i = stream.Read(buf, 0, 1024);
result += Encoding.ASCII.GetString(buf, 0, i);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码旨在检索从TcpClient
单独的线程上运行的一段时间的消息.Read
方法工作正常,直到它应该返回-1表示没有任何东西可以阅读; 相反,它只是在没有任何明显原因的情况下终止它正在运行的线程 - 使用调试器跟踪每个步骤表明它只是在该行之后停止运行.
我也尝试用一个try ... catch
没有太大成功的封装它.
可能是什么导致了这个?
编辑:我试过了
NetworkStream stream = socket.GetStream();
if (stream.CanRead)
{
while (true)
{
int i = stream.Read(buf, 0, 1024);
if (i == 0)
{
break;
}
result += Encoding.ASCII.GetString(buf, 0, i);
}
}
Run Code Online (Sandbox Code Playgroud)
感谢@JonSkeet,但问题仍然存在.线程终止于该read
行.
编辑2:我修改了这样的代码,它的工作原理.
while (stream.DataAvailable)
{
int i = stream.Read(buf, 0, …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下二进制配置读取二进制文件
00 00 00 1A 79 20 83 DB 44 ...
Run Code Online (Sandbox Code Playgroud)
使用以下功能
static BitArray getBitArray(string filename)
{
FILE *fs = fopen(filename.data(),"r");
fseek (fs , 0 , SEEK_END);
unsigned long s = ftell (fs);
rewind (fs);
unsigned char *buffer = new unsigned char[s+1];
fread(buffer,1,s,fs);
BitArray bArray;
for(int i=0; i<s; i++)
bArray.add(buffer[i]);
delete[] buffer;
fclose(fs);
return bArray;
}
Run Code Online (Sandbox Code Playgroud)
这里BitArray
只是我自己的一点操纵类.问题是,对于我上面提到的bin文件,它只读取前三个0,就像这样
00 00 00
Run Code Online (Sandbox Code Playgroud)
即使fseek
找到了正确的文件大小.
至于为什么我需要字符串0,是因为00 00 00 1A
形成一个32位整数,它恰好小到足以留下三个0x00
s.
我怀疑0x00
在文件开头的一串s被识别为EOF
,所以我尝试在文件前填充一个字符,但它没有完全解决.
可能是什么导致了这个?
以下是可用于+
操作的类的示例.
class A
{
public:
int *array;
A()
{
array = new int[10];
}
~A()
{
delete[] array;
}
A operator+ (const A &b)
{
A c;
for(int i=0; i<10; i++)
c.array[i] += array[i] + b.array[i];
return c;
}
};
int main()
{
A a,b,c,d;
/* puts some random numbers into the arrays of b,c and d */
a = b+c+d;
}
Run Code Online (Sandbox Code Playgroud)
a
在复制结果之前是否会运行析构函数b+c+d
?如果没有,我如何确保没有内存泄露?
该+
运算符重载设计这种方式使得没有操作数被修改.
我认为允许递归有时候非常方便,不是因为我可以在"递归"中编码,而是因为我可以为某些情况保存一些代码空间,如下所示
public class SomeClass
{
private int a;
SomeClass(int a)
{
this.a = a;
}
SomeClass()
{
SomeClass(3);
}
}
Run Code Online (Sandbox Code Playgroud)
当一个构造函数试图利用包含大块代码的另一个构造函数时,这尤其有效.
但是,Java显然不支持这个功能,我相信它并不是一个很好的理由.有人可以解释为什么吗?