我试图将Singleton设计模式合并到我的代码中,但我开始遇到一个奇怪的错误:
main.obj : error LNK2005: "private: static class gameState * gameState::state" (?state@gameState@@0PAV1@A) already defined in gameState.obj
Run Code Online (Sandbox Code Playgroud)
如果您不熟悉单例模式,它基本上只用于在整个程序中强制执行某个对象的1个实例.以下是相关代码:gameState.h:
class gameState
{
public:
static gameState* Instance() {return state;}
.
.
.
private:
gameState();
static gameState* state;
};
gameState* gameState::state = new gameState();
Run Code Online (Sandbox Code Playgroud)
现在我只是在main.cpp文件中使用该对象的实例:
gameState *currState = gameState::Instance();
.
.
.
for_each(currState->getHumanPieces().begin(),currState->getHumanPieces().end(), drawPieces);
Run Code Online (Sandbox Code Playgroud)
看起来我试图重新定义gameState :: state,但无法弄清楚为什么......帮助任何人?
解决了这个问题,但仍然存在一个错误,我之前并没有真正发布,因为我认为它只是另一个错误的一部分:
error LNK2019: unresolved external symbol "private: __thiscall gameState::gameState(void)" (??0gameState@@AAE@XZ) referenced in function "void __cdecl `dynamic initializer for 'private: static class gameState * gameState::state''(void)" (??__E?state@gameState@@0PAV1@A@@YAXXZ)
Run Code Online (Sandbox Code Playgroud)
关于如何解决这个问题的任何好的提示?
谢谢你们两位,修好了:D
我有以下情况:
class A { public static $arr=array(1,2); }
class B extends A { public static $arr=array(3,4); }
Run Code Online (Sandbox Code Playgroud)
有没有什么办法,以这2个阵,因此结合B::$arrIS 1,2,3,4?
我不需要改变这些数组,但我不能声明它们是als const,因为PHP不允许使用const数组./sf/
PHP手册指出,我只能分配字符串和常量,因此parent::$arr + array(1,2)不起作用,但我认为应该可以这样做.
我今天早些时候提出了一个关于单身人士的问题,我在理解遇到的一些错误时遇到了一些困难.我有以下代码:
class Timing {
public:
static Timing *GetInstance();
private:
Timing();
static Timing *_singleInstance;
};
Run Code Online (Sandbox Code Playgroud)
#include "Timing.h"
static Timing *Timing::GetInstance() { //the first error
if (!_singleInstance) {
_singleInstance = new Timing(); //the second error
}
return _singleInstance;
}
Run Code Online (Sandbox Code Playgroud)
这段代码中有两个错误,我无法弄清楚.
该方法GetInstance()在标头中声明为static.为什么在cpp文件中我必须省略这个词static?它给出了错误:"无法声明成员函数'静态时序*Timing :: GetInstance()'具有静态链接".写它的正确方法是:
Timing *Timing::GetInstance() { ... }
Run Code Online (Sandbox Code Playgroud)为什么我不能写_singleInstance = new Timing();?它给出了错误:"对Timing :: _ singleInstance的未定义引用".我通过_singleInstance在cpp文件中定义为全局变量来解决此错误.
我有这个课,比方说Foo.它extends JFrame是一个单身人士.话虽如此,它有两个静态字段:1)Foo和2 的实例a Color.
这是一段代码片段Foo:
public class Foo extends JFrame{
private static final Color FOO_RED = new Color(155, 64, 69);
private static final Foo INSTANCE = new Foo();
private Foo(){
//do stuff
}
public static Foo getInstance(){
return INSTANCE;
}
}
Run Code Online (Sandbox Code Playgroud)
我还有另一堂课,比方说Launcher.这是负责启动应用程序的主类.这是一个简单的类,它唯一的工作就是将构造任务委托Foo给EDT.
这是一段代码片段Launcher:
public class Launcher{
public static void main(String[] args){
SwingUtilities.invokeLater((new Runnable(){
@Override
public void run()
{
Foo.getInstance(); …Run Code Online (Sandbox Code Playgroud) 我试图在C++中定义一个静态成员指针.但是我收到链接器错误.错误是
1>main.obj : error LNK2001: unresolved external symbol "public: static class Activity * * Solution::temp" (?temp@Solution@@2PAPAVActivity@@A)
1>Solution.obj : error LNK2001: unresolved external symbol "public: static class Activity * * Solution::temp" (?temp@Solution@@2PAPAVActivity@@A)
Run Code Online (Sandbox Code Playgroud)
码:
class Solution{
public:
Activity **solution;
Solution();
Solution(Activity **list, bool direction);
static Activity** temp;
};
Run Code Online (Sandbox Code Playgroud)
活动是另一个类.我怎么解决这个问题?
我有一个在main的同一个文件中定义的类,另一个类(完整的静态函数/成员)在2个单独的文件中定义,它崩溃了.我想这可能与全局/静态实例的生命周期有关.似乎在ctor中,静态成员尚未初始化,并且可能发生在退出时,静态成员在第一个实例被销毁之前被释放.这是测试代码:
//testh.h
#include <map>
class Sc {
public:
static void insert();
static void out();
private:
static std::map<int, int> map_;
};
//testcpp.cpp
#include "testh.h"
#include <iostream>
std::map<int, int> Sc::map_;
void Sc::insert() {
map_.insert(std::make_pair(2,3));
}
void Sc::out() {
for(auto m : map_) {
std::cout << m.first << ' ' << m.second << '\n';
}
}
//main.cpp
#include "testh.h"
class Nc {
public:
Nc() {
Sc::insert();
Sc::out();
}
~Nc() {
Sc::insert();
Sc::out();
}
};
Nc nc;
int main() {
system("pause");
return 0;
} …Run Code Online (Sandbox Code Playgroud) 我正在写一个Android应用程序,我刚刚创建了一个类.
public class ClassA {
private static int aNumber;
public static void setANumber (int aNumber) {
//set the field
}
public static int getANumber () {
return aNumber;
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我无法设置该aNumber字段,因为它与参数具有相同的名称.如果它是一个实例字段,我可以使用this.但这是一个静态领域!有没有办法实现与this静态字段的关键字相同?我真的需要更改参数名称吗?
我有以下代码(一个更复杂项目的简单示例),其中我有一个对象类型列表的静态"主"列表.
如果您单步执行代码,我希望通过构造函数创建第二个referenceManager3类型时,_masterList将包含String和Object列表.但事实并非如此.
我假设这是因为ReferenceManager3的每个实例实际上是不同的类类型,因为泛型类型定义.我认为这是正确的吗?
我怎样才能做到这一点?
class Program
{
static void Main(string[] args)
{
ReferenceManager3<string> StringManager = new ReferenceManager3<string>();
ReferenceManager3<object> IntManager = new ReferenceManager3<object>();
}
}
class ReferenceManager3<T> where T : class //IReferenceTracking
{
// Static list containing a reference to all Typed Lists
static List<IList> _masterList = new List<IList>();
// Object Typed List
private List<T> _list = null;
public ReferenceManager3()
{
// Create the new Typed List
_list = new List<T>();
// Add it to the Static Master List
_masterList.Add(_list); // …Run Code Online (Sandbox Code Playgroud) 我有一个静态类,希望它有静态QSettings.但是在初始化时我得到一个警告:
QSettings* MySQLConnection::settings = new QSettings(QApplication::applicationDirPath() + "/config.ini", QSettings::IniFormat);
Run Code Online (Sandbox Code Playgroud)
QCoreApplication :: applicationDirPath:请首先实例化QApplication对象
作为一种解决方法,我QSetting在主函数的开头手动初始化.有没有更好的方法来初始化我的静态成员?
谢谢!
C++ 17引入了内联变量,并且可以使用初始化程序在类定义中定义内联静态数据成员.它不需要一个类外的定义.例如,
struct X {
inline static int n = 1;
};
Run Code Online (Sandbox Code Playgroud)
鉴于此,我认为没有理由不总是使用内联静态数据成员,以获得简洁的语法.这样做的任何陷阱?请注意,我不介意慢速编译.
static-members ×10
c++ ×6
java ×2
static ×2
c# ×1
c++17 ×1
generics ×1
inheritance ×1
inline ×1
php ×1
qapplication ×1
qt ×1
redefinition ×1
singleton ×1
swing ×1