Есть некий класс Contakt.class, но названия не имеет значение так как классов много, суть в том что вместо Contakt нужно подставить динамически другие значения. Я получаю данные text и вставляю их в строку String q2=text; далее у меня есть код где есть Contakt.class, но вместо Contakt нужно вставить q2, где и храняться названия других классов. Получится что-то вроде q2.class, где вместо q2 будут различные значения. Есть ли такая возможность на Java?
Ответ
С помощью методов Class.forName() и newInstance() объекта Class можно динамически загружать и создавать экземпляры класса в случае, когда имя класса неизвестно до момента выполнения программы. Class c = Class.forName("com.xyz.MyClass");
Object obj = c.newInstance();
MyClass myClass = (MyClass) obj;
Ума хватило только на такой вот код , но в этом случае появляются все инпуты сразу jQuery(".edit-settings").click(function () {
if($('.sett-drop').is(":visible")){
$('.sett-drop').hide("fast");
}else {
$('.sett-drop').show("fast");
};
});
Как же сделать так , чтобы при клике на ссылку открывался именно тот div, который нужно ? Присваивать id не вариант , так как таких блоков довольно таки много.
Ответ
Чуточку поправила код и:
$(".edit-settings").click(function () {
var
$this = $(this),
wrap = $this.closest('.settings-line'),
drop = wrap.find('.sett-drop');
if(drop.is(":visible")){
drop.hide("fast");
}else {
drop.show("fast");
}
});
.sett-drop {
display: none;
}
P.S: Небольшой алгоритм (мне помогает) --> Берем ссылку на которую кликаем $(this) --> для нее находим обертку в которой она же находится (.settings-line) --> в этой обертке находим контейнер который скрывается\раскрывается и с ним работаем.
Не могу разобраться в сути this.
Когда метод вызывается, ему автоматически передается ссылка на вызывающий
объект, т.е. тот объект, для которого вызывается данный метод class SomeClass
{
private string name = "No name";
private static void WriteToLog(SomeClass aSomeObject)
{
Console.WriteLine("Обрабатывается объект с именем " + aSomeObject.name);
} public SomeClass(string name)
{
//Хотим присвоить значение аргумента, полю класса
this.name = name;
} public void DoWork()
{
WriteToLog(this);
} }
А что передается в WriteToLog(this) при его вызове? Ссылка на что? т.е. при SomeClass tmpObj = new SomeClass("Иван");
tmpObj.DoWork();
передается ссылка на объект tmpObj ?
Ответ
MSDN
The this keyword refers to the current instance of the class and is also used as a modifier of the first parameter of an extension method.
Ключевое слово this указывает на текущий экземпляр класса. Также используется в качестве модификатора для первого параметры в методах расширениях
Таким образом внутри определения класса - это ссылка на конкретный объект, для которого выполняется тот или иной метод. SomeClass tmpObj = new SomeClass("Иван");
tmpObj.DoWork();
this внутри DoWork в данном случае указывается на tmlObj, так как эта функция вызывается у этого объекта.
Доброго времени суток. Не могу вникнуть в ключевые кадры анимации, а точнее, например делаю слайдер, в нем 3 картинки, задаю анимации 15 секунд скорости, и infinite.
Теперь например хочу сделать что бы картинка стояла 3 секунды далее уходила влево за 2 сек. И за ней сразу же шла вторая картинка, и она должна стоять 3 секунды, и уходить влево за 2 секунды, далее за ней третья картинка выдвигается и 3 сек стоит. И т.д. Так вот, очень хочется понять эту тему, объясните пожалуйста подробней, как мне грамотно рассчитать ключевые кадры? Сам я пытался сделать так: 0%{left: 0px;opacity: 1}
16%{left: 0px;opacity: 1}
25%{left: -680px; opacity: 0}
34%{left: -680px; opacity: 0}
43%{left: 680px;opacity: 0}
52%{left: 680px;opacity: 0}
61%{left: 0;opacity: 1}
70%{left: 0;opacity: 1}
79%{left: -680px;opacity: 0}
88%{left: 680px;opacity: 0}
97%{left: 680px;opacity: 0}
100%{left: 0px;opacity: 0}
Но на конечной точке, первая картинка не выдвигается плавно как до этого, а встает на первую точку резко.
Ответ
Это решение для варианта, когда текущий слайд уезжает со следующего.
Если требуется просто сдвиг слайдов, то надо использовать другой способ. Какова длительность всей анимации? (3 сек + 2 сек) * 5 шт = 25 сек.
1 сек = 4%. Как сделать анимацию каждой картинки? 3s картинка просто стоит: 0% { left: 0; }
12% { left: 0; }
2s уезжает влево: 18% { left: -100%; }
Потом незаметно возвращается обратно: 18.001% { z-index: -1; left: -100%; }
100% { z-index: -1; left: 0; }
Значения повторно использовать нельзя, поэтому добавляем отклонение на .001%.
Но надо, чтобы за 2 секунды до конца блок уже был видим, поэтому последнюю строку заменяем на: 92% { z-index: 0; left: 0; }
100% { z-index: 0; left: 0; }
Исправить косяк с анимацией z-index - не показывать элемент раньше чем нужно: 91.999% { z-index: -1; left: 0; }
Как сделать анимацию слайдера? Использовать animation-delay для слайдов. Что Можно улучшить? Производительность за счёт использование transform:translate вместо left.
section {
position: relative;
height: 10em;
overflow: hidden;
}
div {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
z-index: -1;
animation: slide 25s linear infinite both;
}
@keyframes slide {
0% { z-index: 1; left: 0; }
12% { z-index: 1; left: 0; }
18% { z-index: 1; left: -100%; }
18.001% { z-index: -1; left: -100%; }
18.002% { z-index: -1; left: 0; }
91.999% { z-index: -1; left: 0; }
92% { z-index: 0; left: 0; }
100% { z-index: 0; left: 0; }
}
Установил Git-2.10.0-64-bit на Windows 7.
Проблема в том что некорректно отображается ярлык в Пуске
и при правом щелчке мышки на рабочем столе.
Как сделать что б отображался нормальный ярлык.
Ответ
Для того, чтобы отображались верные значки в контекстном меню необходимо изменить два значения Icon в ветках реестра HKEY_CLASSES_ROOT\Directory\Background\shell\git_gui и HKEY_CLASSES_ROOT\Directory\Background\shell\git_shell. Соответственно указать путь до какого-либо значка, например, "C:\Program Files\Git\mingw64\share\git-gui\lib\git-gui.ico"
Рандом работает не так как нужно: при каждом вызове функции Random, матрицы заполняются одинаково public void Random()
{
Random random = new Random(); for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
matrix[i, j] = random.Next(0, 10);
}
}
}
Ответ
По умолчанию, Random использует текущее время, в качестве начального значения в генераторе псевдослучайных чисел. Раз у Вас обе матрицы одинаковые, значит вызовы Random() функции происходят слишком близко по времени. В качестве решения, Вы можете использовать один объект класса Random в обоих вызовах, чтобы исключить подобную ситуацию; т.е. Вам нужно вынести Random в поле класса.
#include
#include using namespace std; class complex {
double re, im;
public:
complex(double = 0, double = 0);
~complex(); complex operator+(complex&);
complex operator-(complex&);
complex operator*(complex&);
complex operator/(complex&);
complex operator^(unsigned);
friend istream& operator >> (istream &, complex&);
friend ostream& operator << (ostream &, complex &);
}; complex::complex(double r, double i)
{
re = r;
im = i;
} complex::~complex() { } complex complex::operator+(complex&y)
{
return complex(re + y.re, im + y.im);
} complex complex::operator-(complex&y)
{
return complex(re - y.re, im - y.im);
} complex complex::operator*(complex&y)
{
return complex(re*y.re - im*y.im, re*y.im + im*y.re);
} complex complex::operator/(complex&y)
{
double r1 = re;
double i1 = im;
double r2 = y.re;
double i2 = y.im;
return complex((r1*r2 - i1*i1) / (r2*r2 + i2*i2), (-r1*i2 + i1*r2) / (r2*r2 + i2*i2));
} complex complex::operator^(unsigned n)
{
complex y(1, 0);
for (int i = 1; i <= n; i++)
y = y*(*this);
return y;
} istream& operator >> (istream& is, complex& x)
{
char c;
cin >> c;
assert(c == '(');
cin >> x.re;
cin >> c;
assert(c == ',');
cin >> x.im;
cin >> c;
assert(c == ')');
return is; } ostream& operator<<(ostream&os, complex&x)
{
os << '(' << x.re << ',' << x.im << ')' << endl;
return os;
} int main(){ complex a(1, 1);
complex b(1, 1);
complex c(1, 1);
complex x; cout << "Введите комплексное число в формате: (re,im) ->";
cin >> x;
cout << "Результат =" << a*(x ^ 2)) + b*x + c << endl;
return 0;
}
На линуксе выводит ошибку:
invalid initialization of non-const
для строки: cout << "Результат =" << a*(x ^ 2) + b*x + c << endl;
Саму программу скопировал с Windows, ошибки исправил, только эту выдает. В чем здесь проблема? И как можно ее решить? На Visual Studio работала нормально.
Ответ
Объявите данные операторы следующим образом complex operator+( const complex&) const;
complex operator-(const complex&) const;
complex operator*(const complex&) const;
complex operator/( const complex&) const;
complex operator ^( unsigned int ) const;
friend ostream& operator << (ostream &, const complex &);
Нельзя связывать временные объекты с неконстантной lvalue ссылкой. Обратите внимание , что конструктор класса является преобразующим конструктором. Поэтому у вас будет работать выражение complex + double, как, например, complex a( 10, 10 );
complex b = a + 10;
Но не будет работать выражение double + complex complex a( 10, 10 );
complex b = 10 + a; // ошибка компиляции
так как ваши операторы являются членами класса. Вы могли бы их объявить как отдельные функции, не являющиеся членами класса, которые принимают два аргумента. Например, friend complex operator +( const complex &lhs, const complex &rhs )
{
return complex( lhs.re + rhs.re, lhs.im + rhs.im );
}
В этом случае второе выражение было бы также верным. Эта дружественная функция может быть определена как в самом классе, и тогда при использовании оператора будет применен зависящий от аргумента поиск (ADL), либо вне класса. Что касается Visual Studio, то его компилятор имеет собственные расширения языка (которые активизированы по умолчанию; вы можете отключить эту опцию в настройках компилятора, и тогда будет выдано сообщение об ошибке), которые порой противоречат стандарту C++. Не стоит полагаться на эти расширения языка компилятора C++ Visual Studio, так как код будет не переносимым. EDIT: Так как у вас возникают трудности правильно набрать код, то приведу для вас рабочий вариант программы. Я не проверял, определены ли правильно операторы с точки зрения математики. #include
#include class complex
{
private:
double re, im; public:
complex( double = 0, double = 0 );
~complex(); complex operator +( const complex & ) const;
complex operator -( const complex & ) const;
complex operator *( const complex & ) const;
complex operator /( const complex & ) const;
complex operator ^( unsigned int ) const;
friend std::istream & operator >>( std::istream &, complex & );
friend std::ostream & operator <<( std::ostream &, const complex & );
}; complex::complex( double r, double i ) : re( r ), im( i )
{
} complex::~complex() { } complex complex::operator +( const complex &c ) const
{
return complex( re + c.re, im + c.im );
} complex complex::operator -( const complex &c ) const
{
return complex( re - c.re, im - c.im );
} complex complex::operator *( const complex &c ) const
{
return complex( re * c.re - im * c.im, re * c.im + im * c.re );
} complex complex::operator /( const complex & c ) const
{
double r1 = re;
double i1 = im;
double r2 = c.re;
double i2 = c.im;
return complex( ( r1 * r2 - i1 * i1 ) / ( r2 * r2 + i2 * i2 ),
(-r1 * i2 + i1 * r2 ) / ( r2 * r2 + i2 * i2 ) );
} complex complex::operator ^( unsigned int n ) const
{
complex c( 1, 0 ); for ( unsigned int i = 1; i <= n; i++ ) c = c * *this; return c;
} std::istream & operator >>( std::istream &is, complex &c )
{
char ch; is >> ch;
assert( ch == '(' ); is >> c.re; is >> ch;
assert( ch == ',' ); is >> c.im; is >> ch;
assert( ch == ')' ); return is;
} std::ostream & operator <<( std::ostream &os, const complex &c )
{
return os << '(' << c.re << ',' << c.im << ')';
} int main()
{
complex a(1, 1);
complex b(1, 1);
complex c(1, 1);
complex x; std::cout << "Введите комплексное число в формате: (re,im) ->";
std::cin >> x; std::cout << "x = " << x << std::endl;
std::cout << "x ^ 2 = " << ( x ^ 2 ) << std::endl;
std::cout << "a * ( x ^ 2 ) = " << a * ( x ^ 2 ) << std::endl;
std::cout << "b * x = " << b * x << std::endl;
std::cout << "a * ( x ^ 2 ) + b * x = " << a * ( x ^ 2 ) + b * x << std::endl;
std::cout << "Результат =" << a * ( x ^ 2 ) + b * x + c << std::endl; return 0;
}
Если ввести значение (10,10), то вывод будет выглядеть следующим образом: Введите комплексное число в формате: (re,im) ->(10,10)
x = (10,10)
x ^ 2 = (0,200)
a * ( x ^ 2 ) = (-200,200)
b * x = (0,20)
a * ( x ^ 2 ) + b * x = (-200,220)
Результат =(-199,221)
Constructor constructor = User.class.getConstructor(new Class[]{String.class,String.class,String.class});
System.out.println("Constructor "+constructor);
constructor.newInstance("Hello","From","Reflection");
Из данного примера мне понятно что при передачи конструктору создаётся Обьект массива типа Class. Но вводит в заблуждение: Class.class после чего позволяется вызывать методы Reflection API. Что означает этот .class ? Я знаю что для доступа к методам надо создать обьект любого класса или если метод статичный то доступ будет произведен через имя класса.. В случае с доступом к Reflection API не понятно это окончание .class, я могу вызвать .class у любого класса или интерфейса или примитива int.class как JVM (если так правильно будет сказать) относится к такого рода конструкциям ? Что это и почему оно используется ?
Ответ
Обращение к .class после имени типа возвращает объект типа Class. Этот объект содержит информацию о типе (будь то класс или интерфейс) и используется в тех местах, где нужно передать информацию о типе (рефлексия как один из примеров). Вызов .class на типе эквивалентен вызову getClass() на экземпляре типа. Обычно .class используется там, где нужно указать тип, но нет конкретного экземпляра этого типа. Пример для String System.out.println(String.class.getName());
System.out.println("hello".getClass().getName());
В вашем примере в первой строке вы находите конструктор класса User, который принимает три строковых параметра. Для указания типов параметров используется String.class
Имеется IP - 95.153.128.120 и данный IP как то конвертируется, на выходе получается - 1603895416 С помощью какой функции и или еще чего конвертируется данный IP?
Ответ
в php есть функция int ip2long ( string $ip_address )
ip2long — Конвертирует строку, содержащую (IPv4) Интернет-адрес с точками в целое число (long)
Пример $long = ip2long($ip);
Возвращает целое число или FALSE, если параметр ip_address содержит ошибку. документация
и обратное функция string long2ip ( string $proper_address )
long2ip — Конвертирует адрес в формате "длинное целое"(long integer) в, содержащую адрес Интернет сети(IPv4), стандартную строку с точками
Возвращает Интернет IP адрес в виде строки. документация
// Реализовать класс String для работы со строками. Перегрузить операторы = + += - > < [] (подстрока) ++ --
#pragma once
#include
using namespace std; class String
{
char* s;
int length; public:
String(const char* str="")
{
this->length = strlen(str);
this->s = new char[this->length+1];
for (int i = 0; i < length; i++)
this->s[i] = str[i];
}
String(const String& s1)
{
this->length = s1.length;
this->s = new char[this->length];
for (int i = 0; i < this->length; i++)
this->s[i] = s1.s[i];
}
~String()
{
delete[] s;
}
String& String::operator=(String& right);
String String::operator+(String right);
//String& String::operator+=(const String& right);
friend String& operator+=(String& left, const String& right);
void String::show(); };
А это цпп файл: #include "String.h" void String::show()
{
for (int i = 0; i < this->length; i++)
cout << this->s[i];
}
String& String::operator=(String& right)
{
delete[] this->s;
this->length = right.length;
this->s = new char[this->length];
for (int i = 0; i < this->length; i++)
this->s[i] = right.s[i];
return *this;
} String String::operator+(String right)
{
String new_string;
new_string.length = this->length + right.length;
new_string.s =new char[this->length + right.length+1];
for (int i = 0; i < this->length; i++)
new_string.s[i] = this->s[i];
for (int i = 0; i < right.length; i++)
new_string.s[this->length + i] = right.s[i];
return new_string;
} String& operator+=(String& left, const String& right)
{
return left+right;
}
Почему у меня s3 всё равно при выводе пустая? Помогите начинающему! #include "String.h" void main()
{
String s2("Hello");
String s3;
s3 += s2;
s3.show();
system("pause");
}
Ответ
Мы, начинающие программисты, должны помогать друг другу.:) Начнем с того, что вам следует включить заголовок #include так как вы используете функции, объявленные в этом заголовке. Длину строки лучше определять, как имеющую тип size_t вместо int class String
{
char* s;
size_t length;
//...
Ваши конструкторы неверно копируют строки. Они не копируют в результирующую строку завершающий символ нуля '\0'. Например, String(const char* str="")
{
this->length = strlen(str);
this->s = new char[this->length+1];
for (int i = 0; i < length; i++)
// символ нуля не входи в диапазон `[0, length)`
this->s[i] = str[i];
}
Иначе непонятно, зачем вы выделяете память длиною this->length+1 вместо this->length.
Непонятно, зачем вы вообще используете циклы для копирования строк, когда вы уже используете стандартные C функции из заголовка Лучше было бы объявить конструктор следующим образом String( const char *str = "" )
{
this->length = std::strlen( str );
this->s = new char[ this->length + 1 ];
std::strcpy( this->s, str );
}
То же самое замечание справедливо и для конструктора копирования. В определении класса нельзя указывать квалифицированное имя функций-членов класса при их объявлении. Хотя MS VC++ это допускает, но это является его собственным расширением языка, которое не соответствует стандарту. String& String::operator=(String& right);
^^^^^^^^
Эти объявления String String::operator+(String right);
friend String& operator+=(String& left, const String& right);
лучше переопределить следующим образом friend String operator + ( const String &left, const String &right );
String & operator += ( const String &right );
Функцию show лучше объявить как std::ostream & String::show( std::ostream &os = std::cout ) const;
Переопределите соответствующие функции с учетом выше приведенных замечаний. Что касается копирующего оператора присваивания, то он может быть определен следующим образом String & String::operator =( const String &right )
{
if ( this != &right )
{
size_t n = std::strlen( right.s );
char tmp = new char[ n + 1 ]; std::strcpy( tmp, right.s ); delete [] this->s; this->s = tmp;
this->length = n;
} return *this;
}
Аналогичным образом вам нужно определить оператор String & operator += ( const String &right );
Например String & String::operator +=( const String &right )
{
size_t n = this->length + std::strlen( right.s );
char tmp = new char[ n + 1 ]; std::strcpy( tmp, this->s );
std::strcat( tmp, right.s ); delete [] this->s; this->s = tmp;
this->length = n; return *this;
}
Функция show определяется просто std::ostream & String::show( std::ostream &os ) const
{
return os << this->s;
}
Что касается вашего вопроса Почему у меня s3 всё равно при выводе пустая?
то этот оператор String& operator+=(String& left, const String& right)
{
return left+right;
}
не изменяет левый аргумент. И более того имеет неопределенное поведение, так как возвращает ссылку на временный объект, создаваемый выражением left+right. EDIT: Если оператор operator [], который, как я понимаю, вы также должны определить, позволяет вставлять в объект класса символ '\0', то вам следует изменить определения конструктора копирования, копирующего опреатора присваивания, оператора operator +=, и дружественной функции operator +, заменив стандартные C функции strXXX на memXXX. Ниже приведена демонстрационная программа, которая показывает, как это можно сделать на примере некоторых членов класса. Другие члены класса постарайтесь определить сами. #include
#include class String
{
private:
char *s;
size_t length; public:
String( const char *str = "" )
{
this->length = std::strlen( str );
this->s = new char[ this->length + 1 ]; std::strcpy( this->s, str );
} String( const String &src )
{
this->length = src.length;
this->s = new char[ this->length + 1 ]; std::memcpy( this->s, src.s, this->length + 1 );
} String & operator =( const String &src )
{
if ( this !=+ &src )
{
char *tmp = new char[ src.length + 1 ]; std::memcpy( tmp, src.s, src.length + 1 ); delete [] this->s; this->s = tmp;
this->length = src.length;
} return *this;
} String & operator +=( const String &src )
{
size_t n = this->length + src.length;
char *tmp = new char[ n + 1 ]; std::memcpy( tmp, this->s, this->length );
std::memcpy( tmp + this->length, src.s, src.length + 1 ); delete [] this->s; this->s = tmp;
this->length = n; return *this; } ~String()
{
delete [] this->s;
} std::ostream & show( std::ostream &os = std::cout )
{
return os << this->s;
}
}; int main()
{
String s1( "Hello world!" );
String s2; s2 = s1; s2.show() << std::endl; s2 += " Glad to see you!"; s2.show() << std::endl; return 0;
}
Вывод программы будет следующим Hello world!
Hello world! Glad to see you!
Предположим, у нас есть параметризованный класс public class Example {
...
}
Что можно подставлять в качестве значения параметра X при использовании этого класса в программе?
имя любого интерфейса (например, CharSequence)
символ "?" или более сложное выражение с ключевыми словами extends и
super
значение X можно не указывать, т.е. использовать класс Example как
обычный непараметризованный
имя любого класса (например, Object)
имя любого примитивного типа (например, int)
ссылку на метод (например, Object::toString)
имя любого перечисления (например, DayOfWeek)
значение примитивного типа (например, 42)
Объясните пожалуйста, почему не подходят ответы 1, 2, 3, 4 ?
Ответ
Аргументы типов в Java определены в спецификации в п.п. 4.5.1 В качестве аргумента по спецификации можно поставить ссылочный тип (ReferenceType в Java любой непримитивный тип) либо маску (WildCard, т.е. выражение ? extends/super T). Вот пример допустимого использования Example Example a = new Example();
Example b = new Example