过去几周我一直在尝试学习C++,并对良好实践提出疑问.
假设我有一个会产生一些对象的函数.定义函数以生成类型对象的输出是否更好,或者更好的是将函数作为参数传递给对象指针,以便它可以直接修改它?
我想这个答案取决于场景,但我很好奇效率如何发挥作用.当将对象作为参数传递给函数时,我知道使用const引用更有效,这样函数可以立即访问对象而无需生成副本.
在输出功能结果时,这种效率问题会起作用吗?
我有一个接受字符串(char数组)作为参数的函数.
void enterString(char * my_string);
Run Code Online (Sandbox Code Playgroud)
使用此功能时,我经常发现自己想要输入格式化的字符串.我使用sprintf来做到这一点.但是,我每次都必须创建一个临时字符串,这有点烦人:
char temp_str[100];
sprintf(temp_str, "My lucky number = %d", 11);
enterString(temp_str);
Run Code Online (Sandbox Code Playgroud)
有没有办法在函数参数中直接格式化字符串,所以我不必每次都创建一个临时字符串?就像是:
enterString("My lucky number = %d", 11);
Run Code Online (Sandbox Code Playgroud)
谢谢
我目前正在用C++编写游戏.这个游戏有一个GameManager类.GameManager类包含一个包含指向游戏对象的指针的地图.我已经定义了一个GameObject类,它是一个简单地充当接口的抽象类.
我已经定义了两个派生自GameObject类的类:Enemy和Loot.
我希望我的GameManager类包含游戏对象的地图,或者更确切地说,指向游戏对象的指针.因为我的GameManager拥有这些对象,所以我希望地图包含std :: unique_ptr.
但是,我实际上很难将衍生对象(例如Enemy和Loot)添加到此地图中.
我希望我的GameManager迭代游戏对象并调用抽象方法.从本质上讲,我的GameManager并不关心某些东西是敌人,战利品还是其他东西,它只是想要能够调用基类中声明的"draw"方法.
我如何将指向派生类的unique_ptr添加到包含对基类的unique_ptr的映射?到目前为止,我的尝试导致代码无法编译.我一直收到一个错误,指出我不允许动态地将派生类指针强制转换为基类指针.
如果我使用原始指针,我觉得这个工作正常,但我打算使用智能指针.
码:
#include <memory>
#include <map>
class GameObject
{
public:
virtual void draw() = 0;
};
class Enemy : GameObject
{
public:
void draw() {};
};
class Loot : GameObject
{
public:
void draw() {};
};
int main()
{
std::map<int, std::unique_ptr<GameObject>> my_map;
// How do I add an Enemy or Loot object unique_ptr to this map?
my_map[0] = dynamic_cast<GameObject>(std::unique_ptr<Enemy>().get()); // doesn't compile, complains about being unable to cast to abstract class
return …Run Code Online (Sandbox Code Playgroud) 我知道 O(1) 表示无论输入维度如何,算法都将花费恒定的执行时间。我也明白 O(N) 表示与输入维度大小成正比的执行时间线性增加。
但是,我只是因为记住了它们的定义才知道这一点。我在解释 O(1) 方面没有直觉,只是回想一下这意味着恒定时间执行。我很好奇在阅读大 O 符号时如何理解直觉。
那么对于恒定时间执行 O(1),1 代表什么?为什么不是 O(2)?2 也是一个与输入大小 N 无关的常数。
尝试执行以下操作时,出现“只有自动实现的属性可以在 C# 中具有初始值设定项”错误:
public int Precision
{
get { return Precision; }
set
{
if (value < 0)
Precision = 0;
else if (value > 15)
Precision = 15;
else
Precision = value;
}
} = 12;
Run Code Online (Sandbox Code Playgroud)
为什么这是不允许的?
如果我使用 pthread 函数,我必须在 GCC 上使用“-lpthread”参数以确保正确链接。但是,为什么 GCC 在链接其他标准函数时不需要额外的参数?示例:printf、scanf、POSIX 套接字等。
我对C中stdint.h的概念有点熟悉.通过明确说明整数的大小,头文件将用该机器上的相应整数替换#define整数.例如,如果我的机器有16位无符号整数,uint32_t则将替换为long unsigned int.
但是,假设您的机器仅支持最多32位整数.如果你使用了会发生什么int64_t?如果本机不支持此整数大小,那么如何解决这个问题,因为没有替代方法可以修复它?
编译器会抛出错误并说它无法解决吗?或者它会尝试使用两个32位分配来保存64位数据类型吗?
我目前正在审查一个实现 POSIX 套接字的 C 应用程序。此应用程序通过从套接字读取零字节来间歇性地检查与服务器的连接是否有效。然后检查是否设置了 errno 以确定连接是否正常。这是一个强大的解决方案吗?
uint32_t IsConnected()
{
char dummy[10];
if(read(global_sockfd, dummy, 0) == -1)
{
if(errno != EWOULDBLOCK && errno != EAGAIN)
return FALSE;
else
return TRUE;
}
else
return TRUE;
}
Run Code Online (Sandbox Code Playgroud) C 中的结构声明了一个数据结构,它将不同的数据类型关联到一块连续的内存中。
Typedef 是一种创建用户定义的数据类型名称的方法。这对许多应用程序都很有用,包括<stdint.h>
结构似乎专门与 typedef 一起使用。似乎定义 a 的默认行为struct也应该定义 a typedef。
为什么我要在struct不使用 a 的情况下进行定义typedef?
文件系统提供了一种对磁盘上的数据进行分类(从而导航)的机制。这对我来说很有意义。如果我想找到一些“组”数据,我不想自己记住字节偏移量。我宁愿有一些可以动态导航的查找系统。
但是,我不明白为什么必须存在不同的文件系统。例如,为什么是 NTFS、FAT16/32、EXT?
为什么不同的操作系统(Linux、Windows 等)要依赖不同的方法来组织磁盘上的数据?