我怎么以及何时会调用超类方法?请参考以下两个选项的代码段:
class SuperClass {
public:
void method();
};
class SubClass : public SuperClass {
public:
void someOtherMethdo(){
this->method();
SuperClass::method();
}
};
Run Code Online (Sandbox Code Playgroud) 我对编程很新,只是想知道为什么这个代码:
for ( ; *p; ++p) *p = tolower(*p);
Run Code Online (Sandbox Code Playgroud)
当p指向一个字符串时,是否可以降低c中的字符串大小写?
我只是天真地写了这个:
#include <stdio.h>
template< class... Args >
auto format_for( Args... args, int last_arg )
-> char const*
{
// using Specifier = char const [3];
// static Specifier const s[] = { {'%', 'f'+(0*args), ' '}..., {'%', 'f', 0} };
return reinterpret_cast<char const*>( "" );
}
auto main() -> int
{
printf( "'%s'\n", format_for( 5, 2, 1 ) );
}
Run Code Online (Sandbox Code Playgroud)
它崩溃了Visual C++ 2015更新1,一个ICE(内部编译器错误),并且g ++ 5.1.0维护该函数只接受一个参数,可能是因为忽略了Args无法匹配此模板参数:
C:\my\forums\so\081> cl printf.cpp /Feb printf.cpp printf.cpp(14): fatal error C1001: An internal …
我想在不使用.NET语言内置支持的情况下输入值.
也就是说,给定一个枚举值,我想要一个表示该值及其类型的引用类型对象.
这是一个能够从后期绑定纯C++代码传递枚举值的子目标,这是一个可能的解决方案,因此,我不是在寻找如何使用例如C#boxing(这很容易,并且在很多方面都无关紧要).
以下代码产生......
c:\projects\test\csharp\hello\main.cs(6,26): error CS0122: 'System.Reflection.RuntimeFieldInfo' is inaccessible due to its protection level
但是,使用更多文档化的FieldInfo类,这是签名所MakeTypedReference要求的,我得到一个例外,说参数不是RuntimeFieldInfo.
不成功的代码,实验,C#:
using System.Windows.Forms;
using Type = System.Type;
using TypedReference = System.TypedReference;
using MethodInfo = System.Reflection.MethodInfo;
using FieldInfo = System.Reflection.FieldInfo;
using RuntimeFieldInfo = System.Reflection.RuntimeFieldInfo;
namespace hello
{
class Startup
{
static void Main( string[] args )
{
Type stringType = typeof( string );
Type messageBoxType = typeof( MessageBox );
Type mbButtonsType = typeof( MessageBoxButtons );
Type mbIconType = typeof( …Run Code Online (Sandbox Code Playgroud) 我有一个用C++编写的旧应用程序.我有0经验,但我想在应用程序中进行一些更改.其中之一就是改变一些文字.问题是更新文本的一部分需要是粗体,但我不知道如何做到这一点.我用Google搜索但没有太大的成功.只觉得我现在是用\n新标签去新行\t.
任何聪明的建议?
编辑:
代码示例:
BEGIN
STRING1 "First Example"
STRING2 "Second Example"
Run Code Online (Sandbox Code Playgroud)
并且使用STRING1的地方:
// WelcomeTip ---------------------------------------------//
LPSTR idsWelcomeTip = (LPSTR)GlobalAlloc(GPTR, sizeof(CHAR) * 4098 );
LoadString( waveInDlg->hInstance, STRING1, idsWelcomeTip, 4098 );
waveInDlg->hwndWelcomeTip = CreateWindow(
"STATIC",
idsWelcomeTip,
WS_CHILD | WS_VISIBLE | SS_LEFT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
waveInDlg->hwnd,
NULL,
waveInDlg->hInstance,
NULL
);
SetWindowLongPtr(waveInDlg->hwndWelcomeTip, GWLP_USERDATA ,(LONG)waveInDlg );
SendMessage(waveInDlg->hwndWelcomeTip, WM_SETFONT , (WPARAM)waveInDlg->hFontDefault , TRUE );
ShowWindow(waveInDlg->hwndWelcomeTip, SW_HIDE);
GlobalFree( (HGLOBAL)idsWelcomeTip );
Run Code Online (Sandbox Code Playgroud)
谢谢,
Ile
以下代码是否有效?
A类{string m_name;
public:
string getName(){return m_name; }
}.....
printf("%s",object.getName().c_str())
......
其中object.getName()返回一个临时字符串对象.
我需要使用 VirtualAlloc 为我的项目分配可执行内存,以便 JIT 将自定义脚本格式重新编译为 x86/etc。但我感到困惑的是,其他人似乎都没有注意到,而且它的行为似乎明显缺乏细节。
我知道它分配“虚拟”内存,这意味着它可以是任何物理内存(RAM/磁盘),但在使用时它可以简单地被视为“内存”。但是,例如,如果我做了类似的事情:
#define MB 1024*1024
auto pAddr = VirtualAlloc(NULL, 8*MB, MEM_RESERVE, PAGE_NOACCESS);
VirtualAlloc(pAddr + 4*MB, 1*MB, MEM_COMMIT, PAGE_EXECUTE_READWRITE); // commit 1MB, 4MB's into the reserved memory
Run Code Online (Sandbox Code Playgroud)
是只使用了 1MB,还是 5MB?显然,我并不期望它是 5MB - 我只是不知道在这个看似显而易见的场景中会发生什么。有效吗?保留内存中的任何范围都可以自由提交和取消提交吗?更重要的是,它可以无序使用还是应该增量分配(根据 MSDN 文档,这就是您可以用它做的所有事情)。或者 VirtualAlloc 只对一次分配“页面”感到满意?
我发现的每个示例似乎只是对向我展示如何分配页面感兴趣 - 这可能只是最基本的用途,但远非最实用 - 但我想用它来为可以重新编译的脚本分配已编译的代码执行过程中偶尔会出现。我需要尝试为这些分配创建某种接口,这样我就可以简单地说“给这个脚本编译一些内存”,它将自动返回以前提交的未使用的空间或提交一些新的空间 - 所以关于的任何提示如何最好地从虚拟内存进行分配(例如,最好不要取消提交可能会再次提交的内存?)也将受到赞赏。
注意:这是一个有问必答的问题,目的是记录其他人可能会发现有用的技术,并可能了解其他人的更好解决方案。请随意添加批评或问题作为评论。也可以随意添加其他答案。:)
Visual C++ 一直有一个语言扩展__uuidof(类名),可以检索UUID,一个 128 位通用唯一标识符,前提是 UUID 通过 与类关联__declspec,这也是一个 Visual C++ 语言扩展:
#include <guiddef.h> // GUID, another name for UUID
class
__declspec( uuid( "290ff5cb-3a21-4740-bfda-2697ca13deae" ) )
Foo
{};
#include <iostream>
using namespace std;
auto main()
-> int
{
cout << hex << __uuidof( Foo ).Data1 << endl; // 290ff5cb
}
Run Code Online (Sandbox Code Playgroud)
MinGW g++ 4.8.2(可能还有一些早期版本)支持__uuidof,但不支持 MSVC 的__declspec. 因此,使用 g++ 4.8.2 编译上述内容会失败,至少在我使用的 Nuwen 发行版中是这样。首先 g++ 发出警告“'uuid'属性指令被忽略”,然后一个链接器错误“未定义引用到_GUID …
鉴于此代码:
template< class C >
void foo( C const& o ) { o.nosuch(); }
struct Base {};
void foo( Base const& ) {}
struct Derived: Base {};
auto main() -> int
{
Derived d;
foo( d ); // !Invokes template.
}
Run Code Online (Sandbox Code Playgroud)
...我希望调用调用Base为其定义的重载,而不必为其定义重载或模板特化Derived.
目标是能够应用于foo所有类型的对象,而不仅仅是Base(和Derived)对象,具有大多数对象的通用实现.
如果答案确切地解释了在这种情况下重载解析如何工作,以及它如何与Derived定义的重载一起工作,那也是很好的.
在出现此问题的代码中,foo上面是一个n_items定义如下的函数模板:
template< class Type >
auto n_items( Type const& o )
-> size_t
{ return o.size(); }
template< size_t n …Run Code Online (Sandbox Code Playgroud) 我想在Windows中将提升的命令提示符启动到特定的工作目录.例如,我试过这个:
ShellExecute(
hWnd,
L"runas",
L"cmd.exe",
NULL,
m_szSelectedFile,
SW_SHOW
);
Run Code Online (Sandbox Code Playgroud)
哪里 m_szSelectedFile = L"C:\\Users\\User\\Desktop"
ShellExecute 记录为
HINSTANCE ShellExecute(
_In_opt_ HWND hwnd,
_In_opt_ LPCTSTR lpOperation,
_In_ LPCTSTR lpFile,
_In_opt_ LPCTSTR lpParameters,
_In_opt_ LPCTSTR lpDirectory,
_In_ INT nShowCmd
);
Run Code Online (Sandbox Code Playgroud)
不幸的是,它总是推出C:\WINDOWS\system32.我究竟做错了什么?