我有一些基本类型的Shape指针.我想使用==运算符比较这些对象.如果对象具有不同的派生类型,则==运算符显然应返回false.如果它们具有相同的派生类型,则应该比较派生类型的成员.
我已经读过,使用C++ RTTI是不好的做法,只能在罕见和必要的情况下使用.据我所知,如果不使用RTTI,通常无法解决这个问题.每个重载的==运算符都必须检查typeid,如果它们相同,则执行dynamic_cast并比较成员.这似乎是一种常见的需求.这个问题有某种成语吗?
#include <iostream>
using namespace std;
class Shape {
public:
Shape() {}
virtual ~Shape() {}
virtual void draw() = 0;
virtual bool operator == (const Shape &Other) const = 0;
};
class Circle : public Shape {
public:
Circle() {}
virtual ~Circle() {}
virtual void draw() { cout << "Circle"; }
virtual bool operator == (const Shape &Other) const {
// If Shape is a Circle then compare radii
}
private:
int radius;
};
class Rectangle : public …Run Code Online (Sandbox Code Playgroud) 我从事大规模,多平台,实时网络应用.我工作的项目一般没有真正使用容器或标准库,没有智能指针或任何"现代"C++语言功能.大量原始动态分配的阵列很常见.
我非常想开始使用标准库和一些C++ 11规范,然而,有很多人也在研究我的项目,因为"STL/C++ 11不那么便携,我们冒风险使用它".我们在各种嵌入式系统以及完全成熟的Ubuntu/Windows/Mac OS系统上运行软件.
那么,对我的问题; 标准库和C++ 11关注的可移植性的实际问题是什么?这只是让g ++超过某个版本的情况吗?有些平台没有支持吗?是否需要编译库?如果需要,是否难以获取/编译?有没有人有严重的问题被非便携式纯C++烧毁?
我有一个Bamboo计划来构建一个包,我想用我的开发者证书签署该包.在我的构建脚本中,我有这个:
productsign --sign "Name of my certificate" "input.pkg" "output.pkg"
Run Code Online (Sandbox Code Playgroud)
从命令行运行此脚本按预期方式工作.但是,从Bamboo运行脚本,我总是得到错误:
productsign: error: Could not find appropriate signing identity for "Name of my certificate"
Run Code Online (Sandbox Code Playgroud)
我认为这必须是因为从Bamboo运行时运行构建脚本的上下文.如何在Bamboo中使证书可用?它安装在System,而不是login.
Subversion 1.7工作副本在工作副本的根目录中只有一个.svn目录,而不是工作副本中每个目录中的.svn目录.
假设存储库中有多个目录,当我第一次检出时,我只选择性地检出特定目录.正如文档所说,这只会在顶级目录中创建一个.svn隐藏文件夹.
但是,如果我稍后决定签出另一个目录,则在签出完成后,新签出的目录中将会有另一个.svn目录.
这样做的含义是,如果我尝试从根级别进行提交,它只会知道最初检出的目录.我还必须单独提交任何后续结账.
反正有没有改变这种行为或使两个隐藏的.svn目录合并在一起?或者我是否必须在第一次结帐时检查整个存储库目录结构?
假设您想要按值从向量中删除单个元素.remove -erase有什么区别:
vector<int> v;
// add some values
vector<int>::iterator it = remove(v.begin(), v.end(), 5);
v.erase(it);
Run Code Online (Sandbox Code Playgroud)
并找到 - 擦除
vector<int> v;
// add some values
vector<int>::iterator it = find(v.begin(), v.end(), 5);
if(it != v.end())
{
v.erase(it);
}
Run Code Online (Sandbox Code Playgroud) 我想在开始菜单中为我的程序添加一个快捷方式,如下所示:
MyAppPublisher\MyAppName\MyAppName
Run Code Online (Sandbox Code Playgroud)
我的脚本中有这个:
DefaultGroupName={#MyAppPublisher}
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Run Code Online (Sandbox Code Playgroud)
但是开始菜单文件夹总是:
MyAppName\MyAppName
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我在游戏中有两个向量.一个向量是玩家,一个向量是一个对象.我还有一个向量,指定玩家面对的方向.方向矢量没有z部分.这个点的大小为1,位于原点附近.
我想计算士兵当前面对的方向和物体之间的角度,所以我可以正确地平移一些音频(仅限立体声).
下图描述了我的问题.我想计算两条虚线之间的角度.一条虚线连接玩家和物体,另一条线代表玩家从玩家所处的方向所朝向的方向.

目前,我正在这样做(假设玩家,物体和方向都是3点,x,y和z的向量):
Vector3d v1 = direction;
Vector3d v2 = object - player;
v1.normalise();
v2.normalise();
float angle = acos(dotProduct(v1, v2));
Run Code Online (Sandbox Code Playgroud)
但它似乎给我不正确的结果.有什么建议?
代码测试:
Vector3d soldier = Vector3d(1.f, 1.f, 0.f);
Vector3d object = Vector3d(1.f, -1.f, 0.f);
Vector3d dir = Vector3d(1.f, 0.f, 0.f);
Vector3d v1 = dir;
Vector3d v2 = object - soldier;
long steps = 360;
for (long step = 0; step < steps; step++) {
float rad = (float)step * (M_PI / 180.f);
v1.x = cosf(rad);
v1.y = sinf(rad);
v1.normalise(); …Run Code Online (Sandbox Code Playgroud) 我希望我的安装程序将一些文件放入用户主路径(Windows%USERPROFILE%环境变量指向的路径,以及路径Qt的QDir :: homePath()返回).
我查看了Inno Setup Constants页面,但找不到我要查找的路径.
我正在尝试使用Microsoft Visual C++编译器10.0(x86)在Qt Creator中编译遗留代码,我收到了经典错误:
无法将参数1从'char*'转换为'LPCWSTR'
而不是编辑代码(我不应该做的事情,它是第三方SDK),解决方案是进入Visual Studio常规设置并将字符集更改为
'使用多字节字符集'
但是,我没有使用Visual Studio IDE,也没有使用该设置.所以我需要知道在代码/编译方面实际上做了什么设置.它是设置编译器标志还是#define?如何在Qt Creator中实现同样的目标?
qt character-encoding visual-studio-2010 qt-creator visual-c++
有人能告诉我,在LOOKUP数组中查找时,有没有办法保留数组的正确大小?我有一个感觉,因为当你将数组视为一个int指针时C会丢失信息是不可能的.
const int NUMBERS1[] = {1, 2, 3, 4, 5 };
const int NUMBERS2[] = {1, 2, 3, 4, 5 };
const int* LOOKUP[] = { NUMBERS1, NUMBERS2 };
int main()
{
int correctSize = sizeof(NUMBERS1); // correctSize == 20
int wrongSize = sizeof(LOOKUP[0]); // wrongSize == 4
}
Run Code Online (Sandbox Code Playgroud) 我需要能够读取现有的JSON文件,对其进行修改(例如替换,删除和添加对象,数组和键值对),然后再次将文件写出来.
我正在尝试使用以下内容读取和写入JSON文件:
{
"array": [
{
"name": "Channel",
"default": 1
},
{
"name": "Size",
"default": 457
}
]
}
Run Code Online (Sandbox Code Playgroud)
我正在成功读取该文件,但未能使用以下代码对其进行任何更改:
QFile File("/path/to/myfile.json");
File.open(QIODevice::ReadOnly | QIODevice::Text);
QJsonParseError JsonParseError;
QJsonDocument JsonDocument = QJsonDocument::fromJson(File.readAll(), &JsonParseError);
File.close();
QJsonObject RootObject = JsonDocument.object();
QJsonArray Array = RootObject.value("array").toArray();
QJsonObject ElementOneObject = Array.at(0).toObject();
ElementOneObject.insert("key", QJsonValue(QString("value")));
ElementOneObject.insert("name", QJsonValue(QString("David")));
File.open(QFile::WriteOnly | QFile::Text | QFile::Truncate);
File.write(JsonDocument.toJson());
File.close();
Run Code Online (Sandbox Code Playgroud)
我期待看到数组的第一个元素有一个新名称"大卫"和一个新的键值对"key" : "value".此代码运行后,文件内容相同.我知道该文件已被写出,因为键值对的排序已被更改为按字母顺序排序的键排序.
我如何让文件重新填充我试图做的更改?
我想比较两个派生自相同基类型但不是相同派生类的对象.所以我将==运算符设为虚拟并在派生类中覆盖它.
当我将所有对象存储在基类型的数组中时,不会调用派生的实现,而是直接进入基本实现.但是,当数组是指向基类的类型指针并且取消引用元素时,它确实有效.
请问一些人请解释为什么会出现这种情况?它让我困惑;-)
enum eType {
BASE_TYPE,
DERIVED_TYPE
};
class A {
eType mType;
public:
A() : mType(BASE_TYPE) {}
A(eType Type) : mType(Type) {}
virtual bool operator == (A &Other) {
return mType == Other.mType;
}
};
class B : public A {
int bVal;
public:
B(int Val) : A(DERIVED_TYPE), bVal(Val) {}
virtual bool operator == (A &Other) {
if(!(A::operator ==(Other))) {
return false;
}
B* myB = (B*)&Other;
return bVal == myB->bVal;
}
};
int main(int argc, char *argv[]) …Run Code Online (Sandbox Code Playgroud) c++ ×5
qt ×3
inno-setup ×2
installer ×2
polymorphism ×2
stl ×2
bamboo ×1
c ×1
c++11 ×1
code-signing ×1
g++ ×1
json ×1
macos ×1
math ×1
operators ×1
portability ×1
qt-creator ×1
svn ×1
tortoisesvn ×1
vector ×1
visual-c++ ×1
windows ×1