在过去的几年里,我被C#编码所困扰,现在我又回到了C++,并发现我遇到的问题很简单.我正在使用名为DarkGDK的gamedev的第三方库(任何以db为前缀的命令),但DGDK不是问题.
继承我的代码:
system.h中
#pragma once
#include <string>
#include <map>
#include "DarkGDK.h"
using namespace std;
class System
{
public:
System();
~System();
void Initialize();
static void LoadImage(string fileName, string id);
static int GetImage(string id);
private:
map<string, int> m_images;
};
Run Code Online (Sandbox Code Playgroud)
System.cpp
#include "System.h"
System::System()
{
}
System::~System()
{
}
void System::Initialize()
{
dbSetDisplayMode (1024, 640, 32);
dbSetWindowTitle ("the Laboratory");
dbSetWindowPosition(100, 10);
dbSyncOn ();
dbSyncRate (60);
dbRandomize(dbTimer());
}
void System::LoadImage(string fileName, string id)
{
int i = 1;
while (dbImageExist(i))
{
i++;
}
dbLoadImage(const_cast<char*>(fileName.c_str()), …Run Code Online (Sandbox Code Playgroud) 为什么这在C++中无效?
class CLS
{
public:
static int X;
};
int _tmain(int argc, _TCHAR* argv[])
{
CLS::X=100;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 根据静态成员的概念,当第一次调用它的类时,它们被创建/加载到内存中.它们在该类的所有实例中都很常见.意味着它们不会被重新创建或重新初始化等.此外,它们只能通过类名访问.不需要为该类创建对象来访问它们.
现在我的问题是;
我有一个关于初始化的有趣问题.我有以下代码:
public class ErrorLookupProvider {
private static final ErrorLookupProvider INSTANCE = new ErrorLookupProvider();
private static Map<Long, List<String>> map = new HashMap<Long, List<String>>();
private ErrorLookupProvider() {
init();
}
private void init() {
map.put(123L, ImmutableList.of("abc", "def"));
}
public static ErrorLookupProvider getInstance() {
return INSTANCE;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我打电话时ErrorLookupProvider.getInstance(),我打了一个NPE.里面的地图init()没有用new初始化HashMap.
如果我将声明更改map为final,那么我会看到它已初始化.或者,即使我删除静态并使其成为私有类变量private Map<.....>也是如此.
我无法弄清楚为什么会这样.有人能解释一下这里发生了什么吗?
我在C++中看到了关于动态链接的这篇文章.
我们可以创建一个C++工厂,它将返回我们感兴趣的类的对象.此外,我们应该在工厂的文件范围内创建一个静态对象,以便可以使用它来定位它dlsym().(文章建议静态对象不会受到名称损坏.)
为什么静态对象没有名称损坏?
在Java中,静态方法和变量可以通过对象引用访问,就像在下面的程序中一样,它工作得很好:
//StaticDemo.java
class StaticVerifier{
private int a,b;
public StaticVerifier(int a,int b){
this.a = a;
this.b = b;
System.out.println("Values are "+this.a+" "+this.b);
}
public static void takeAway(){
System.out.println("This is a static method...");
}
}
public class StaticDemo{
public static void main(String[] args){
StaticVerifier sv = new StaticVerifier(3,4);
sv.takeAway();
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试在C#中转换相同的代码时,它不允许对象访问静态方法并给出编译时错误.请参阅下面的代码和相关错误:
//StaticDemo.cs
using System;
public class StaticVerifier{
private int a,b;
public StaticVerifier(int a,int b){
this.a = a;
this.b = b;
Console.WriteLine("Values are "+this.a+" "+this.b);
}
public static void takeAway(){
Console.WriteLine("This is …Run Code Online (Sandbox Code Playgroud) 如何在C++中获取类的私有静态成员的内存地址.在下面的代码中,我通过他们的内存地址直接访问类的私有成员.
#include <iostream>
class directM {
int a;
int b;
public:
directM(int aa , int bb){
a = aa;
b = bb;
}
void show(){
std::cout << a << b << std::endl;
}
};
int main(){
directM dm(10,20);
dm.show();
*(int*)( &dm ) = 15;
*(int*)( ( (int*)(&dm) ) + 1 ) = 25;
dm.show();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我更改其中一个成员并使其成为静态,即
static int b;
现在我如何能够通过其地址直接访问此私有成员.
注意: - 我知道这是一种非常不明智的方式来访问数据,我不是用它来解决任何问题.这只是一个学习练习,可以更好地了解语言.
如果我有嵌套类,并且这些嵌套类具有静态成员,那些成员对于封闭类仍然是静态的吗?例如,如果我有
class Enclosing {
public:
Enclosing();
private:
class Nested {
public:
Nested();
private:
static int thing;
};
};
Run Code Online (Sandbox Code Playgroud)
如果我做
auto A = Enclosing();
auto B = Enclosing();
Run Code Online (Sandbox Code Playgroud)
愿意A并且B能够拥有不同的价值观thing吗?
我正在尝试使用DLIB的face_landmark_detection_ex.cpp在Visual Studio中构建C++应用程序.构建应用程序从命令promt运行,经过训练的模型和映像文件作为参数传递.
face_landmark_detection_ex.exe shape_predictor_68_face_landmarks.dat image.jpg
Run Code Online (Sandbox Code Playgroud)
这 shape_predictor_68_face_landmarks.dat是68个地标的训练模型,用于对输入图像执行检测,并且每次都需要在运行时加载以执行任何检测.我正在尝试做以下事情.
有没有办法在我的应用程序中打包此文件,以便运行更少的物理内存.
更新:
如何将此shape_predictor_68_face_landmarks.dat文件存储在静态缓冲区中,以便每次shape_predictor都可以从此缓冲区读取.
我使用googletest框架尝试创建一个继承的Fixture类,以进行参数化和共享资源测试。
class FixtDBadminConnShared : public ::testing::Test {
public:
static void SetUpTestCase() {
shared_conn_ = new ::DB::DB_connection();
}
static void TearDownTestCase() {
delete shared_conn_;
}
static ::DB::DB_connection * shared_conn_;
};
::DB::DB_connection * FixtDBadminConnShared::shared_conn_ = nullptr;
class FixtDBadminConnExec :public FixtDBadminConnShared, public ::testing::TestWithParam<string>
{
protected:
using FixtDBadminConnShared::SetUpTestCase;
using FixtDBadminConnShared::TearDownTestCase;
void SetUp() override {
query_ = GetParam();
}
string query_;
};
Run Code Online (Sandbox Code Playgroud)
尝试调用测试:
TEST_P(FixtDBadminConnExec, SelectWithoutParam) {
//do smth
}
INSTANTIATE_TEST_CASE_P(QueriesOrbital0param, FixtDBadminConnExec,
::testing::Values( string{ "SELECT * from my_table;" }));
Run Code Online (Sandbox Code Playgroud)
我收到下一个错误
Error C2594 'return': ambiguous conversions from …Run Code Online (Sandbox Code Playgroud)