我遇到了我正在制作的程序中的接口问题.我想创建一个接口,它的一个方法接收/返回对自己对象类型的引用.它是这样的:
public interface I {
? getSelf();
}
public class A implements I {
A getSelf() {
return this;
}
}
public class B implements I {
B getSelf() {
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
我不能使用"I",它是"?",因为我不想返回对接口的引用,而是类.我搜索并发现Java中没有办法"自我引用",所以我不能只用"?"来代替它.在"自"关键字的示例中或类似的东西.实际上,我找到了一个类似的解决方案
public interface I<SELF> {
SELF getSelf();
}
public class A implements I<A> {
A getSelf() {
return this;
}
}
public class B implements I<B> {
B getSelf() {
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
但它看起来似乎是一种解决方法或类似的东西.还有另一种方法吗?
我已经定义了一个名为class的模板CallBackAtInit,其目的只是在初始化时调用一个函数(构造函数).该函数在模板参数中指定.问题是模板不接受std::function参数; 但他们接受函数指针.为什么?
这是我的代码:
#include <iostream>
#include <functional>
/* Does not work:*/ template <typename return_type, typename arg_type, std::function<return_type(arg_type)> call_back>
/* Work fine: */// template <typename return_type, typename arg_type, return_type(*call_back)(arg_type)>
class CallBackAtInit {
public:
CallBackAtInit(arg_type arg)
{
call_back(arg);
};
};
void printInt(int i);
class HoldInt : private CallBackAtInit<void, int, printInt> {
public:
HoldInt(int integer)
: CallBackAtInit(integer)
{}
// ...
};
int main(int argc, char** argv)
{
HoldInt hi(10);
return 0;
}
void printInt(int i)
{
std::cout << i …Run Code Online (Sandbox Code Playgroud) 我update()每秒运行一次方法来"更新"用户的键盘输入,以便稍后在程序的逻辑部分中读取它.所以我在SDL Docs中找到了两种实现方法,我不确定应该使用哪一种方法.
1; 使用SDL_PollEvent循环搜索关键/关闭事件并将关键状态保存在地图中,以便我可以检查程序逻辑中的每个关键状态.
注意:或者,我也可以使用SDL_PeepEvents而不是SDL_PollEvent来仅采用重要的事件类型; 所以,它不会"抛弃"队列中的事件.
std::map<int, bool> keyboard; // Saves the state(true=pressed; false=released) of each SDL_Key.
void update()
{
SDL_Event event;
while( SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_KEYDOWN:
keyboard[event.key.keysym.sym] = false;
break;
case SDL_KEYUP:
keyboard[event.key.keysym.sym] = true;
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
2; 每帧从键盘拍摄快照,以便我可以轻松阅读.
Uint8* keyboard;
void update()
{
SDL_PumpEvents();
keyboard = SDL_GetKeyState(NULL);
}
Run Code Online (Sandbox Code Playgroud)
通过以上任何实现,我可以keyboard像这样阅读:
if (key_map[SDLK_Return]) printf("Return has been pressed.");
Run Code Online (Sandbox Code Playgroud)
还有,还有另一种方法吗?
我知道可以声明函数参数、函数返回和类属性的类型。(如下所示)
class HasString {
private string $value;
public function getValue() : string
{
return $value;
}
public function setAttribute(string $arg0)
{
$this->value = $arg0;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,以下内容将不起作用。
// Tested in PHP 7.4.1
string $localVar = "value"; // Parse error: syntax error, unexpected '$localVar' (T_VARIABLE) in php shell code on line 1
Run Code Online (Sandbox Code Playgroud)
php 是否有可用于显式声明局部变量类型的语法?
这对于捕获变量接收意外值的错误非常有用,并有助于 IDE 在处理混合或未指定的函数返回时识别变量类型。
我试图在JavaFX 2.0中使用CSS.但它不起作用.我试图导入一个CSS文件:
// Import CSS
Group root = new Group();
Scene scene = new Scene(root, 300, 250, Color.LIGHTGREEN);
scene.getStylesheets().add("example.css");
Run Code Online (Sandbox Code Playgroud)
但NetBeans始终抛出以下异常:
警告:com.sun.javafx.css.StyleManager $ 2运行未找到资源"null".
我试图将CSS文件放在项目目录中,进入src目录并使用绝对路径: "C:\\Users\\janus\\Documents\\NetBeansProjects\\example.css"
没有解决问题
我正在尝试使用Windows上的g ++ C++编译器编译我的代码,编译器返回一些错误.好的,像往常一样.但是它打印了很多错误,控制台只是直到最后,我看不到错误日志的第一行.我的问题是:有什么方法可以将错误日志打印到外部文件,这样我就可以阅读完整的错误日志了吗?
即
g++ *.h *.cpp > error_log.txt
Run Code Online (Sandbox Code Playgroud)
谢谢!
考虑下面的代码.
// Consider that MyObject receives three integers in it's constructor.
MyObject createObject()
{
MyObject result(1, 2, 3);
return result;
}
Run Code Online (Sandbox Code Playgroud)
只要我知道,当你在C++中返回一个对象时(比如在这个函数中),编译器将在客户端的堆栈中创建一个新对象(作为局部变量).在这个例子中,它将是一个MyObject使用带有resultas参数的复制构造函数创建的新对象.这意味着对机器进行冗余处理:result将在堆栈中创建对象,然后创建并返回第二个对象.避免这种情况的另一种方法是动态创建对象(不在堆栈中),然后返回它的指针.但它会导致内存泄漏或强制客户端在使用后删除该对象.所以,我找到的解决方案是使用智能指针,如下所示:
// Consider that MyObject receives three integers in it's constructor.
boost::smart_ptr<MyObject> createObject()
{
boost::smart_ptr<MyObject> result(new MyObject(1, 2, 3));
return result;
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,但智能指针仍然是一个将被重新创建的对象(即使成本很低,因为它基本上只包含一个指针).我猜是否有办法更轻松地做到这一点; 或者如果编译器没有一种方法可以优化这项工作或类似的东西.是否有一种语法可以告诉编译器做我想要的事情?
我正在构建一个非常小的 google chrome 扩展程序,以打开我在 Spotify 上收听的歌曲的Genius歌词页面。我成功地从 Spotify 正确获取了歌曲数据,并且可以向 Genius 验证用户身份,但是当我搜索歌曲时,请求在预检时失败。
Genius 响应{"meta":{"status":403,"message":"Action forbidden for current scope"}},并且 chrome 正在控制台上打印此内容:Response for preflight has invalid HTTP status code 403。
尽管 Genius 似乎归咎于令牌的范围,但我尝试使用所有范围(me、create_annotation、manage_annotation和vote)进行身份验证,但问题仍然存在。此外,相同的请求使用相同的令牌与 Postman 一起工作正常。
我的代码如下:
let xhttp = new XMLHttpRequest();
xhttp.open("GET", "https://api.genius.com/search?q=Paranoid", true);
xhttp.setRequestHeader("Authorization", "Bearer " + accessToken);
xhttp.send();
Run Code Online (Sandbox Code Playgroud)
完整的请求:
General
Request URL:https://api.genius.com/search?q=Paranoid
Request Method:OPTIONS
Status Code:403
Remote Address:104.16.213.100:443
Referrer Policy:no-referrer-when-downgrade
Request Headers
:authority:api.genius.com
:method:OPTIONS
:path:/search?q=Paranoid
:scheme:https
accept:*/*
accept-encoding:gzip, …Run Code Online (Sandbox Code Playgroud) 出于此问题的目的,"常量引用"是对对象的引用,您无法从该对象调用修改对象或修改其属性的方法.
我想要这样的东西:
Const<User> user = provider.GetUser(); // Gets a constant reference to an "User" object
var name = user.GetName(); // Ok. Doesn't modify the object
user.SetName("New value"); // <- Error. Shouldn't be able to modify the object
Run Code Online (Sandbox Code Playgroud)
理想情况下,我会使用自定义属性(例如[Constant])标记不修改实例的类的每个方法,并且只能从常量引用调用这些方法.如果可能,在编译期间调用其他方法将导致错误.
我的想法是,我可以返回一个只读引用,并确保它不会被客户端修改.
在我假设的应用程序中的某个时刻,为了效率,我想在单个请求中创建多个不同类型的相关实体。在下面的示例中,我以包含有关新用户及其相关头像的数据的方式序列化请求。
// POST /api/users
{
data: {
attributes: { ... },
type: 'user',
relationships: {
avatar: {
data: {
attributes: { ... }
type: 'avatar',
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,在 JSONAPI 中这样做的正确/推荐方法(如果有的话)是什么?
在C++中,是否有某种方法可以创建一个类,该类具有作为属性的类的对象,该类具有作为属性的第一个类的对象?
例如:
class A {
B attribute;
public:
A(){}
};
class B {
A attribute;
public:
B(){}
};
Run Code Online (Sandbox Code Playgroud)
上面的代码不能编译.有什么方法可以做同样的事情吗?
谢谢!
这是上下文:
我有一个应该说'嗨'的A级,但由于A不知道演讲,它使用B级的对象为他演讲.因为A持有B的唯一目的是B演讲它,有不需要每个A拥有它自己的B对象;因此我选择使用唯一的静态私有B.
像这样:
class A {
static B b;
public:
void sayHi();
};
void A::sayHi()
{
b.sayHi();
}
Run Code Online (Sandbox Code Playgroud)
B就像这样:
class B {
public:
void sayHi();
};
void B::sayHi()
{
std::cout << "Hi!" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
问题是当我尝试使用g ++编译器编译此代码时...
int main() {
A a;
a.sayHi();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我收到"未定义的引用"错误.我不知道为什么这不起作用,我想知道编译器认为我指的是A中的非静态B,但我不知道它应该如何.
PS:在我的代码中,B的声明在A声明之前发布.