我正在尝试学习如何使用常量函数和对象,但是,我有一些错误使我保持了一个多小时,我似乎无法弄明白.我跟着一个简单的例子,我想我在路上的某个地方迷路了.这是我的代码.
Main.cpp的
#include <iostream>
#include "ExampleClass.h"
int main(){
ExampleClass exampleObj; // object used to call members of ExampleClass.
exampleObj.printText(); // calls printVar from the ExampleClass.
const ExampleClass constantObject; // object used to call constant members of ExampleClass.
constantObject.printConstText(); // calls printConstVar from the ExampleClass.
return 0;
}
Run Code Online (Sandbox Code Playgroud)
ExampleClass.h
#ifndef EXAMPLECLASS_H
#define EXAMPLECLASS_H
class ExampleClass
{
public:
void printText();
void printConstText() const;
};
#endif // EXAMPLECLASS_H
Run Code Online (Sandbox Code Playgroud)
ExampleClass.cpp
#include <iostream>
#include "ExampleClass.h"
void ExampleClass::printText(){
std::cout << "The code works!" << "\n";
} …Run Code Online (Sandbox Code Playgroud) 是否有任何易于使用的,高层次的类或库,让你互动VARIANT的可视化(C S)++?
更具体地讲,我想POD类型(例如之间的转换double,long),字符串(如CString),和容器(如std::vector)和VARIANT秒.例如:
long val = 42;
VARIANT var;
if (ToVariant(val, var)) ... // tries to convert long -> VARIANT
comObjPtr->someFunc(var);
std::vector<double> vec;
VARIANT var = comObjPtr->otherFunc();
if (FromVariant(var, vec)) ... // tries VARIANT -> std::vector<double>
Run Code Online (Sandbox Code Playgroud)
我(天真地?)假设与COM一起工作的人一直这样做,所以最有可能是一个方便的库来处理各种转换.但是我能找到的所有内容都是各种各样的包装类,每个类都转换为几种类型:
有没有简单的方法 - 没有切换到Visual Basic - 以避免这种笨拙的内存管理和按位VT_ARRAY | VT_I4代码的噩梦?
相关问题: …
可能重复:
C++中struct和class之间有什么区别
http://www.cplusplus.com/reference/std/typeinfo/type_info/
我想我的"老师"并没有告诉我很多关于C++中struct和classes之间的区别.
我在其他一些问题中读到有关继承的问题,结构默认是公共的...我也猜测struct没有构造函数/析构函数...
那么其他的差异呢?他们这么重要吗?
在谈到私有/受保护的属性/方法时,它们在运行时是不可访问的,只是因为编译器在编译时告诉它并报告错误,对吧?然后将这些功能与类进行比较,"信息隐藏"真正为程序员带来了什么?是否在这里,当有人重用该类时,这个人不会滥用该类,因为编译器会报告私有/受保护的东西?
我仍然为信息隐藏的真正目的而苦苦挣扎,它仍然希望在我的脑海中发出声音,因为它为程序带来更多安全性,意味着更少的安全漏洞,但我真的很困惑这种设计在语言中的目标...... (而且我不打算以任何方式反对C++,我只是想了解在什么情况下这个功能可能有趣或不;如果不是,那不是问题,但我只是想知道...).
我之前听说POD类型不能拥有私有数据 - 但根据C++ 0x草案,我的要求是宽松的(强调我的):
对所有非静态数据成员具有相同的访问控制(第11条)
这似乎暗示私人数据是好的,只要它都是私有的.我没有C++ 03的副本但是要查看...
那么,WindowsApi::Uuid是POD课吗?
namespace WindowsApi
{
class Uuid
{
union
{
::UUID asUuid; //Win32's UUID struct
unsigned __int64 asInt64s[2];
unsigned __int32 asInt32s[4];
};
public:
Uuid() {}
Uuid(::UUID sourceStructure) : asUuid(sourceStructure) {}
operator ::UUID() { return asUuid; }
};
}
Run Code Online (Sandbox Code Playgroud) 我有一个原型函数,如下所示:
void function(std::string str);
Run Code Online (Sandbox Code Playgroud)
我的main函数在另一个加载和使用该dll的程序中调用此函数.
function("some string value here");
Run Code Online (Sandbox Code Playgroud)
从这个函数返回时,我得到堆损坏错误:
Windows已在program.exe中触发断点.
这可能是由于堆的损坏,这表示program.exe或它已加载的任何DLL中的错误.
这也可能是因为用户在program.exe具有焦点时按下F12.
输出窗口可能包含更多诊断信息.
玩弄我的代码我发现了一些奇怪的观察结果:
1.当传入的字符串长度小于11个字符时,我没有错误,只要我添加更多字符就会出现错误.
2.当从改变参数的类型std::string到std::string&错误消失.传递参考的想法来自这里.
我已经注释掉了这个功能的主体.那里的操作与产生的异常无关.
4.更改参数类型从std::string到char*也解决了这个问题.
可能导致此错误的原因是什么?我该如何解决?
以下代码
#include <iostream>
#include <new>
#include <cstring>
#include <type_traits>
template<typename T>
void is_pod(char* c)
{
cout << "Type " << c;
if(std::is_pod<T>::value)
::std::cout << " is POD" << endl;
else
::std::cout << " is not!" << endl;
}
#define CHECK_TYPE(ty) ::is_pod<ty>(#ty)
struct POD_Parent{};
struct POD_Child : public POD_Parent{int y;};
struct POD_Child2 {int x; POD_Parent y; POD_Child ssd;};
int main()
{
CHECK_TYPE(POD_Parent);
CHECK_TYPE(POD_Child);
CHECK_TYPE(POD_Child2);
Run Code Online (Sandbox Code Playgroud)
给出以下结果:哪个很奇怪!
Type POD_Parent is POD
Type POD_Child is not!
Type POD_Child2 is POD
Run Code Online (Sandbox Code Playgroud)
POD_Child怎么不是POD?!和POD_Child2是POD?!!
请注意,我使用MinGW编译它(使用选项-std = c …
是否有一个类/结构的术语既是平凡的布局又是标准布局,但也没有指针成员?
基本上我想引用"真正的"普通旧数据类型.我可以从内存中获取并存储在磁盘上的数据,并将其读回内存以供以后处理,因为它只不过是一组int,字符,枚举等.
如果类型是"真正的"普通旧数据类型,有没有办法在编译时进行测试?
我的课程中有4个属性的结构"边距".我没有写出四种不同的getter/setter方法,而是认为我可以用更好的方式做到:
class myClass {
private:
struct margin {
int bottom;
int left;
int right;
int top;
}
public:
struct getMargin();
void setMargin(string which, int value);
};
Run Code Online (Sandbox Code Playgroud)
但是如何在函数中设置与字符串"which"对应的struct的属性setMargin()?例如,如果我打电话myClass::setMargin("left", 3),我怎么能将"margin.left"设置为"3"?最好在保持结构POD的同时?我真的无法弄清楚这一点......
从旁注来看,这真的比编写许多getter/setter方法更好吗?
谢谢!
可能重复:
C ++中的POD类型是什么?
我正在用C ++写一个解释器,我想确保某些C ++数据类型在通过解释的代码访问时(尤其是在使用反射时)具有可预测的布局。因此,例如,我想确保第一个数据字段始终与对象地址的偏移量为零。现在,这对于纯POD类型来说是微不足道的。但是,我想知道这是否还可以用于具有继承或构造函数的对象,只要我避免使用虚函数或多重继承之类的明显东西即可。是否合理地假设编译器将以与C编译器相同的方式布局这些类型,还是我需要担心C ++标准中的“未指定行为”?
如果我没有为C++类提供显式的析构函数,因为我确信编译器提供的默认析构函数是我所有类的需求,那很好吗?或者这被认为是不好的做法?
c++ ×9
pod ×3
inheritance ×2
struct ×2
class ×1
const ×1
destructor ×1
dll ×1
standards ×1
types ×1
variant ×1
visual-c++ ×1
windows ×1